websphere MQ 編程指南(Java)

接觸websphere MQ 已經兩年了,現在才搞明白有兩種讀取數據的方式,感覺狠汗顏。壓根都沒想着去了解一下,這次徹底的去查閱了一下官方的資料,本文除了介紹對應的讀取方式也會提供關鍵性的代碼,給予參考。

  • 第一種格式:破壞性讀取
從隊列中直接獲取信息,隊列深度減少,信息自動清除。
int openOptions = MQC.MQOO_FAIL_IF_QUIESCING|MQC.MQOO_INPUT_AS_Q_DEF|MQC.MQOO_OUTPUT|MQC.MQOO_INQUIRE;
		// 打開隊列
		try {
			mQueue = qMgr.accessQueue(this.queuename,openOptions);
			logger.info("訪問隊列"+this.queuename);
		} catch (MQException exp) {
			logger.error(this.queuename+"隊列訪問失敗",exp);
		}								

  • 第二種格式:瀏覽性讀取

   採用瀏覽指針的方式獲取隊列中的信息,隊列深度不減少,信息保留。

//瀏覽消息
		int openOptions =  MQC.MQOO_FAIL_IF_QUIESCING|MQC.MQOO_BROWSE;
		// 打開隊列
		try {
			mQueue = qMgr.accessQueue(this.queuename,openOptions);
			logger.info("訪問隊列"+this.queuename);
		} catch (MQException exp) {
			logger.error(this.queuename+"隊列訪問失敗",exp);
		}	

以上主要區別在隊列AccessQueue的參數上,參數的詳解:

MQC.MQOO_FAIL_IF_QUIESCING     
 IBM官方的文檔描述:Fail if the queue manager is quiescing.

MQC.MQOO_BROWSE   
IBM官方的文檔描述:Open to browse message.

MQC.MQOO_INPUT_AS_Q_DEF       
IBM官方的文檔描述:Open to get messages using queue-defined default.

MQC.MQOO_OUTPUT
IBM官方的文檔描述:Open to put messages.

MQC.MQOO_INQUIRE
IBM官方的文檔描述:Open for inquiry - required if you want to query properties


以上參數中MQC.MQOO_INQUIRE和讀取隊列的深度有關係,如果你要用到隊列深度的話,必須採用這個參數。

以下是隊列數據讀取信息的代碼:
 
  • 破壞性讀取
try {
			
			int depth = this.getQueueDepth();
			//將隊列的裏的消息讀出來
			if(depth>0)
			{
				MQMessage msg = new MQMessage();// 要讀的隊列的消息
				MQGetMessageOptions gmo = new MQGetMessageOptions();
				mQueue.get(msg, gmo);
				logger.info("消息的大小爲:"+msg.getDataLength());
				System.out.println("---------------------------");
				str=new byte[msg.getDataLength()];
				msg.readFully(str);
 				msg.clearMessage();}
			} 
			catch (MQException e)
			 {
			    logger.error(e);} catch (Exception e) {logger.error(e);}




以上參數byte[] str將會是最終的結果,將會以二進制的方式存儲。
getQueueDepth()這個方式是獲取當前隊列的深度,實際上是調用mQueue.getCurrentDepth()
有多少條消息可以根據隊列的深度來確定
  • 瀏覽性讀取
	boolean firstBrowsed = false;
	boolean isContinue = true;
         while (isContinue)
         {
             MQMessage mqMsg; // MQMessage instance
             MQGetMessageOptions mqGetMsgOpts; // MQGetMessageOptions instance

             mqMsg = new MQMessage();
             mqGetMsgOpts = new MQGetMessageOptions();
             //mqGetMsgOpts.waitInterval = 15000; // 15 second limit for waiting
             if (!firstBrowsed)
             {
                 mqGetMsgOpts.options |= MQC.MQGMO_WAIT + MQC.MQGMO_BROWSE_FIRST;

             }
             else
             {
                 mqGetMsgOpts.options |= MQC.MQGMO_WAIT + MQC.MQGMO_BROWSE_NEXT;
             }
             try
             {
            	 mQueue.get(mqMsg, mqGetMsgOpts);
                 firstBrowsed = true;
                 if (mqMsg.getMessageLength() > 0)
                 {
		    String str=mqMsg.readString(mqMsg.getMessageLength()));
                 }
             
             }
             catch (MQException mqe)
             {
				if (mqe.reasonCode != MQException.MQRC_NO_MSG_AVAILABLE)
				{
					try
					{
						qMgr.backout();
					}
					catch (MQException e)
					{
						// TODO Auto-generated catch block
						//logger.error(e);
					}
				}
				else
				{
					isContinue = false;
				}
             }
	    catch (Exception e)
	    {
		// TODO Auto-generated catch block
		logger.error(interfacename+"沒有消息到達!");
	    }
       }
瀏覽消息就感覺是和鏈表(linkList)一樣的原理,獲取到隊列的頭後,採用link的方式獲取下一條消息,一直到消息爲空。
以上是參考代碼中str將會以String的類型返回。這種讀取的方式會直接過濾掉文件頭,
如果需要做文件頭分析,就要參考破壞性讀取的代碼,對接收這塊重新修改。

以上詳細描述了MQ對隊列的讀取的兩種方式,希望對所有的MQ操作者有所幫助。
另外推薦一篇IBM官方的文檔: 
爲中小型企業定製websphere MQ v7,這篇文檔中基本就介紹了MQ使用的基本環境和要求,
以及實施和解決方案,以及監控方式。
另外一片是關於優化MQ使用的:
在 Windows 和 UNIX 上配置和優化 WebSphere MQ 性能
這篇文檔介紹了優化MQ的配置方式,非常詳細推薦。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章