2014-09-23 75 views
2

我們有一個應用程序使用JMS從IBM Websphere隊列(版本7.5)同步讀取4MB消息。在某些情況下,我想丟棄隊列中的消息而不讀取它們。我試圖找出是否有一種方法可以在不讀取整個4MB消息的情況下以編程方式執行此操作,這需要幾秒鐘的時間(可能有數百條消息需要丟棄)。在丟棄()方法(或類似)的由於缺少,這裏是我曾嘗試:(通過讀取到一個更大的緩衝如何使用Java/JMS丟棄隊列中的消息?

BytesMessage msg = (BytesMessage)queueReceiver.receiveNoWait(); 
bytesRead = msg.readBytes(msgBytes, 1024); // just read 1024 bytes 
queueReceiver.close(); 

上面的代碼是沒有快於從隊列中檢索整個4MB消息)。這使我相信,在進行readBytes()調用之前,receiveNoWait()調用正在將整個消息下載到內部緩衝區中。我能提供的唯一其他信息是隊列設置爲「自動應答」當會話啓動:

queueSession = queueConnection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); 

如果我更改爲CLIENT_ACKNOWLEDGE和acknowlege使用msg.acknowledge消息()會有理想的效果嗎?還是有什麼我失蹤?

感謝您的幫助, 道格

+0

in activemq你可以直接使用這個消息,但我不確定這是否意味着讀取消息來做到這一點。確實很好的問題。 – Leo 2014-09-23 22:54:09

+0

消息從服務器到客戶端的傳輸方式非常正確。是否有關於消息的某些內容,如確定是否應該刪除消息的屬性?或者是否有其他標準? – Calanais 2014-09-24 06:38:47

+0

數據庫中的狀態碼告訴應用程序不再需要隊列中的消息(由於其他故障情況)。我無法清除整個隊列,因爲還有其他線程正在處理其他消息。我只是想清除特定的消息而不下載它們,而這似乎不可能使用JMS。 – Doug 2014-09-25 18:45:51

回答

1

有沒有其他辦法,消息必須消耗採取從隊列中刪除。

從AUTO_ACKNOWLEDGE更改爲CLIENT_ACKNOWLEDGE不會有任何區別,因爲確認是告訴消息傳遞提供程序從隊列中刪除消息的方式。 AUTO_ACKNOWLEDGE選項告訴JMS客戶端自動向提供者發送確認消息,而應用程序使用CLIENT_ACKNOWLEDGE來明確告訴提供者刪除消息。

您可以看看如何設置您不打算使用的消息的到期時間。到期時間設置的郵件在到期時間結束後將不可用於投放。閱讀消息的JMSExpiration屬性。

0

考慮到這一些更多的想法,並有可能在這裏另一種方式; MQ具有PCF消息的概念 - 只需將管理命令作爲消息發送到隊列管理器即可。

JMS可以發送這些消息 - 因此一旦您知道不需要更多消息,就會發送CLEAR_QUEUE命令。

這是一個相當廣泛的方法 - 清除整個隊列,但這取決於您的標準是用於刪除郵件。

但是,我可以看到用例有選擇地刪除消息 - 可能值得在IBM developerWorks站點上提出'請求增強'RFE?

+0

如果IPPROCS和/或OPPROCS不爲零,則PCF CLEAR_QUEUE命令將不起作用。 – Roger 2014-09-24 16:58:19

0

據我所知,JMS無法讀取消息的一部分。您只能使用C或Java(非JMS)來執行此操作。

MQGetMessageOptions gmo = new MQGetMessageOptions(); 
gmo.options = MQC.MQGMO_NO_WAIT + MQC.MQGMO_FAIL_IF_QUIESCING; 

MQMessage getMsg = new MQMessage(); 
try 
{ 
    /* get the message with only 1 byte of message data */ 
    _inQ.get(getMsg, gmo, 1); 
} 
catch (MQException e) 
{ 
    System.err.println(e.getLocalizedMessage()); 
} 
+0

大家好,謝謝你的回覆。我曾嘗試使用客戶確認模式,正如Shashi所預測的那樣,它沒有任何作用。不幸的是,我不能清除整個隊列。我現在的選擇是讓消息過期或全部下載。不幸的是,讓他們過期似乎不適合我。測試表明,當我們孤立許多4MB消息而其他線程正在檢索消息時(我們使用關聯ID檢索它們),隊列管理器的性能會降低。再次感謝大家的反饋意見。 – Doug 2014-09-25 17:40:04