我們有一個應用程序使用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消息()會有理想的效果嗎?還是有什麼我失蹤?
感謝您的幫助, 道格
in activemq你可以直接使用這個消息,但我不確定這是否意味着讀取消息來做到這一點。確實很好的問題。 – Leo 2014-09-23 22:54:09
消息從服務器到客戶端的傳輸方式非常正確。是否有關於消息的某些內容,如確定是否應該刪除消息的屬性?或者是否有其他標準? – Calanais 2014-09-24 06:38:47
數據庫中的狀態碼告訴應用程序不再需要隊列中的消息(由於其他故障情況)。我無法清除整個隊列,因爲還有其他線程正在處理其他消息。我只是想清除特定的消息而不下載它們,而這似乎不可能使用JMS。 – Doug 2014-09-25 18:45:51