我正在實現一個組件,該組件可以在特定隊列可用時讀取所有消息,但應該只能從隊列中異步刪除消息,消息內容已被處理並保留。我們讀取消息的速度比我們承認的要快(例如,我們可以閱讀10條消息,然後我們已準備好確認第一條消息)。當前的實現使用XMS API,但如果XMS不適合這些用途,我們可以切換到MQI。.net XMS中的IBM-MQ讀取器逐個確認處理後的消息
我們嘗試了兩種方法來嘗試解決這個問題,但都具有使它們無法接受的缺點。我希望有人能提出更好的方法。
第一個實現在專用線程中使用IMessageConsumer
來讀取所有消息並在其可用時發佈其內容。消息處理完畢後,調用message.Acknowledge()
方法。會話由AcknowledgeMode.ClientAcknowledge
創建。這種方法的問題在於,根據文檔,這會確認(並刪除)已收到的所有未確認消息。以上面的例子來說,這意味着所有10個讀取的消息都會在第一次調用時收到。所以這並不能真正解決問題。因爲讀的吞吐量,我們需要的,我們確實不能修改這個解決方案,以等待第一個消息的ACK讀取第二前等
第二個實施已決定的線程使用的IQueueBrowser
閱讀所有郵件和發佈他們的內容。這不會在隊列讀取時從隊列中刪除消息。一個單獨的專用線程然後等待(在BlockingQueue上)已處理的消息的JMS消息ID。對於其中的每一個,它然後構造一個專用的IMessageConsumer
(使用帶有JMSMessageID的消息選擇器)來讀取消息並對其進行確認。 (IQueueBrowser
與專用IMessageConsumer
的配對由XMS文檔關於隊列瀏覽器的部分推薦。)此方法的工作方式與預期相同,但正如人們所想象的那樣,它在MQ服務器上佔用CPU太多。
是的,這就是行爲,消息無法確認隨機的。一個消息確認將消除所有先前的消息。 MQ .NET中也沒有選項。從你的描述看來,你可以用一個確認電話確認所有消息,但你更關心吞吐量。你期望的吞吐量是多少? – Shashi
預期吞吐量:最活躍的隊列上每天最多100萬條消息,MQ服務器上每個隊列每天最多1000萬條消息的組合。 – Josh
只是爲了澄清:我們不能真正讀取和處理每封郵件順序(讀斷下之前)的主要原因是,實際的處理具有相當顯著交貨時間 - 這就是爲什麼我們需要同時處理許多消息。 – Josh