2013-05-30 28 views
4

我正在使用MQSeries構建消息傳遞系統。出於某種原因,當我執行q.get(...)時,我得到一個異常拋出(我不知道具體的MQException)。下面是導致錯誤的代碼:刪除來自MQQueue的熱門消息

private static MQGetMessageOptions GMO = new MQGetMessageOptions(); 
private static int GMO_OPTIONS = MQC.MQGMO_SYNCPOINT | MQC.MQGMO_WAIT; 
GMO.options = GMO.options | GMO_OPTIONS; 
GMO.waitInterval = MQC.MQWI_UNLIMITED; 

MQEnvironment.hostname = args[0]; 
MQEnvironment.channel = args[2]; 
MQEnvironment.port = Integer.parseInt(args[1]); 
MQQueueManager queueManager = new MQQueueManager(args[3]) 

MQMessage msg = new MQMessage(); 
MQQueue q = queueManager.accessQueue("qName1",MQC.MQOO_OUTPUT); 
q.get(msg, GMO); 

我的計劃是,當發生此錯誤時,跳過消息並將其刪除。要執行刪除,我會調用下面的函數:

private void deleteMsg(MQQueueManager queueManager, String queueName) throws MQException { 
    MQGetMessageOptions tempGmo = new MQGetMessageOptions(); 
     tempGmo.options |= MQC.MQGMO_WAIT; 
     tempGmo.waitInterval = 1000; 
    MQQueue remover = queueManager.accessQueue(queueName, MQC.MQOO_INPUT_AS_Q_DEF); 
     remover.get(new MQMessage(), tempGmo); 
     queueManager.commit(); 
} 

會在我deleteMsg功能remover.get()也,在這種特定情況下,失敗出於同樣的原因?或者用於構造MQQueue的選項(MQC.MQOO_INPUT_AS_Q_DEF與MQC.MQOO_OUTPUT)是否也阻止它失敗?如果我無法訪問我的隊列消息,我該如何丟棄頂部消息並轉到下一個消息?

縮短我的問題: 如果我無法在給定隊列上執行get()來檢索消息,我們如何才能刪除同一隊列上的損壞消息?

謝謝!

回答

4

OMG!

MQQueue q = queueManager.accessQueue("qName1",MQC.MQOO_OUTPUT); 
q.get(msg, GMO); 

您正在爲輸出(寫入)打開一個隊列,但您正試圖獲取消息。你的鞋子在錯誤的腳上!其次,爲什麼不捕獲MQ將拋出的MQException ??例外情況將包括原因代碼,這些代碼可能會給你對問題的確切解釋。

這裏是你應該如何打開隊列閱讀:

try 
{ 
    int oo = MQC.MQOO_INPUT_SHARED + MQC.MQOO_FAIL_IF_QUIESCING; 
    MQQueue q = queueManager.accessQueue("qName1",oo); 
    MQGetMessageOptions gmo = new MQGetMessageOptions(); 
    gmo.options = MQC.MQGMO_NO_WAIT + MQC.MQGMO_FAIL_IF_QUIESCING; 
    q.get(msg, gmo); 
} 
catch (MQException e) 
{ 
    System.err.println(e.getLocalizedMessage()); 
    System.err.println("CC = " + e.completionCode + " - RC = " + e.reasonCode); 
} 

此外,請確保您使用適當的「失敗如果停頓」,爲特定的MQ API調用的選項。

最後,查找「退出隊列」。如果您的應用程序遇到消息問題,那麼應將消息移至退出隊列,而不是簡單地刪除。

+0

謝謝您的輸入。我正在捕獲MQException,但不幸的是,我創建的日誌不再存在。所以我無法確定確切的例外情況。我會看看你的其他建議,謝謝。 – Porter

0

我不是爲什麼你在做什麼不適合你,但我想知道你爲什麼使用MQ系列的專有API而不是使用JMS API。在JMS中,刪除頂部消息就意味着收到消息,因此致電session.receieve()即可完成此工作。

使用常見的JMS API有很多優點。其中最主要的是,您可以輕鬆地從MQ系列移植到任何其他消息解決方案,而無需更改一行代碼。

0

我不知道該程序是否編譯,因爲沒有稱爲GMO_OPTIONS的選項。所有MQ常量都以前綴MQC

+0

我的歉意,我遺漏了什麼GMO_OPTIONS設置。我編輯了上面的代碼。謝謝! – Porter