2012-06-29 191 views
0

我有MQConsumerClass,它從隊列中檢索消息,如下所示。WebSphere MQ MessageListener(類似於JMS消息監聽器)

while (running) 
{ 
    try 
    { 
     MQMessage rcvMessage = new MQMessage(); 
     MQGetMessageOptions gmo = new MQGetMessageOptions(); 

     gmo.options = MQConstants.MQGMO_WAIT; 
     gmo.waitInterval = 60000; 
     queue.get(rcvMessage, gmo); 

     if(rcvMessage.getTotalMessageLength() > 0) 
     { 
      String msgText = rcvMessage.readUTF(); 
     } 
    } 
    catch blocks{} 
} 

但問題是當隊列中沒有消息時,2033異常被拋出。

我認爲2033 NO_MSG_AVAILABLE異常不是嚴重異常,可能會停止操作。

但是,只要隊列中有新消息,我就要調用onMessage(Message msg)函數。

我想用MessageListener創建這個類,但是我找不到MessageListener或者任何與它有關的例子。

因此,請告訴我WMQ Java API中是否有MessageListener函數。

有沒有辦法做到這一點?

回答

1

那麼,WMQ Java API沒有消息監聽器。類似於JMS的onMessage不存在,只有同步接收。

+0

那麼,你的意思是不是比while循環選擇其他?爲了減少while循環的次數,我使用了MQConstants.MQGMO_WAIT;並將waitInterval設置爲半分鐘(60,000)。但是,「MQJE001:完成代碼'2',原因'2033'」。如果隊列在waitInterval結束之前沒有任何消息則顯示。那麼,我怎樣才能避免這種異常?我編輯了我的新代碼。非常感謝你的幫助。 –

1

在這種循環中,你不能完全避免這些2033「無消息」異常。通過增加等待間隔,幾乎沒有什麼缺點(除了可能在完成時緩慢關閉應用程序以外),並且您將減少無法爲每次獲取呼叫獲取消息的機會。例如,如果您指定一個5分鐘的等待間隔,只要每5分鐘至少有一條消息到達隊列中,那麼每次獲得呼叫都會收到一條消息(通常情況下)。但您仍然需要一個catch塊來處理這種異常,因爲您應該期望在等待間隔內無法找到消息。只要你的等待時間不太短,失敗的性能開銷,catch塊和respin在循環周圍,應該是相對較小的。

如果您確實想要在消息可用時調用應用程序的異步使用方,那麼用於JMS的WebSphere MQ類是Java API,您將在其中找到MessageListener接口。 WebSphere MQ公開了2個不同的Java API。您的代碼段使用Java的WebSphere MQ類,而不是JMS。

5

2033'錯誤'確實不是錯誤,它更像是一個MQSeries返回狀態:MQRC_NO_MSG_AVAILABLE 2033 MQTester程序正在輪詢尋找消息的隊列,但沒有可用的消息。

您可以

MQException.logExclude(新 整數(MQException.MQRC_NO_MSG_AVAILABLE))排除;

1

您可以使用MQConstants.MQWI_UNLIMITED來指定最小等待時間間隔。

while (running) { 
     MQGetMessageOptions gmo = new MQGetMessageOptions(); 
     gmo.options = MQConstants.MQGMO_WAIT; 
     gmo.waitInterval = MQConstants.MQWI_UNLIMITED; 

    try { 
     // Get the message off the queue. 
     queue.get(rcvMessage, gmo); 
    } catch (MQException e) { 
    if (e.reasonCode == 2033) { 
     continue; 
    } 

} 

}