2012-01-06 114 views
2

我正在處理一個獨立的MQ JMS應用程序,我們的應用程序需要「知道」客戶端已經使用消息生產者放入隊列。因爲客戶端應用程序不是我們的責任。所以我們不能讓他們寫「msg.acknowledge();」在他們身邊的事情(msg.acknowledge()不是我的條件下的正確方法)。我在stackoverflow中搜索歷史答案。查找以下是完全一樣的東西我想:發件人如何知道已使用MQ JMS API的消息?

https://stackoverflow.com/questions/6521117/how-to-guarantee-delivery-of-the-message-in-jms

Do the JMS spec or the various implementations support delivery confirmation of messages?

我的問題是,是否有任何其他方式的MQ API或JMS API中的存檔嗎?我只需要在msg生成端進行編碼,它可以是隊列或主題。

另一個問題是在JMS中的確認模式CLIENT_ACKNOWLEDGE,是不是產生了不相關的?我始終認爲,這種模式可以在調用send()方法時阻止應用程序,直到客戶端使用消息並調用msg.acknowledge(),但似乎不是這樣。產品在消息傳遞後才退出應用程序,消息只是存儲在隊列中,直到客戶端調用acknowledge()。這有可能讓生產者的應用程序等待,直到消息被客戶確認爲止。

如果我的觀念不對,請糾正我,謝謝。

回答

6

消息隊列的主要目的是解耦生產者和消費者。生產者不需要等待消息被消費者消費,它可以繼續它的工作。理想情況下,如果生產者需要知道消息是否已被消費者處理,它應該等待消費者在另一個隊列上發送響應消息。

消息確認與生產者無關。消息確認是消息通知消息提供者在消息傳遞到應用程序後從隊列中移除消息的方式。

有自動確認JMS提供程序(如MQ JMS)在將消息傳遞到應用程序後告訴消息傳遞提供程序從隊列中移除消息。然後客戶端確認在接收到消息後,應用程序明確告訴消息提供者從隊列中刪除消息。

生產者是否有等待消費者接收消息的原因?一種方法雖然不夠高雅,但可能是:發送消息後,使用已發送消息的消息ID並嘗試瀏覽該消息。如果沒有找到消息,則可以認爲它已被使用

+0

感謝Shashi,您的回覆非常有用。我們需要知道消費者獲得消息並記錄我們的時間戳。所以我們需要知道消費者已經收到消息。如何使用主題來歸檔呢?那是不一樣的嗎?我知道主題可以同步傳遞消息。如果我使用持久訂閱,那可以滿足我的要求嗎? – phyerbarte 2012-01-06 06:43:42

+0

順便說一句,正如你所提到的,我們可以從隊列中檢查消息ID,以確定消息是否已被客戶端使用,是所謂的JMS瀏覽?我對JMS技術細節並不熟悉,只想確認一個方向,然後我可以研究它。再次感謝。 – phyerbarte 2012-01-06 06:47:03

+0

@Shashi,在MQ(IBM)的情況下,客戶端是否必須發送確認消息已經讀取?如果沒有,那麼自動確認段的確切時間是否發送回q管理器?它是在onMessage被調用之後? – bluelurker 2016-02-01 14:43:02