2014-03-27 148 views
2

我試圖解決以下情形:JMS先前消息確認

我使用消息,而是採取在我根據對正確消息處理系統中的中斷(比如例如數據庫)

我正在使用CLIENT_ACKNOWLEDGE,並且只在沒有引發異常時調用.acknowledge()方法。

當我拋出一個異常,消息未被確認,並且我可以看到建立的未確認隊列時,這可以正常工作。但是,這些消息已經全部交付給消費者。

現在假設數據庫重新聯機,並且任何新消息都被成功處理。所以我打電話給他們。我讀到了這個調用.ackackledge()不僅承認了這個消息,而且還承認了消費者以前收到的所有消息。

這不是我想要的!我需要這些先前未確認的消息被重新發送/重試。我想讓他們在隊列中讓JMS處理重試,因爲在消息「重試消息」中維護一個Collection可能會冒失去這些消息的風險(因爲.ackackledge已經讓所有人都失望了)硬件失敗)。

是否有一種方法可以明確確認特定的消息,而不是「承認所有先前的消息」行爲?

回答

1

您需要在重新從第一個未確認消息重新啓動消息傳遞失敗後,在您的會話中調用恢復。從JMS 1.1規範部4.4.11

當使用CLIENT_ACKNOWLEDGE模式,客戶端可以建立一個較大 數未確認的消息的同時試圖對其進行處理。 A JMS提供商應爲管理員提供一種限制客戶端 超限運行的方法,以便客戶端不會因資源耗盡而被驅動,並且當他們正在使用的某些資源暫時被阻止時會導致 發生故障。

會話的recover方法用於停止會話和與它的第一個確認的消息重新啓動它 。實際上,交付消息的會話系列 將重置爲其最後一個確認消息 後的時間點。它現在提供的消息可以是不同於原先遞送由於消息到期 和更高優先級的消息的到達 。

+0

爲了這個工作,我需要關閉我的消費,直到我知道失敗結束。我需要保證消息順序。我什麼時候才能知道致電恢復?我需要等到新消息通過後才能成功處理。在這種情況下,我會在調用恢復來處理以前的消息之前處理一條新消息。 – 75inchpianist

+0

我不確定您的客戶在發生故障時不會如何停止,因爲當tcp連接斷開時您的Connection無效。在失敗後重新連接時,請致電恢復。 –

+0

我與JMS的連接不是失敗的。這是我與數據庫的連接。所以當我消費一條消息時,我試圖將數據從數據庫中提取出來。這會引發異常。所有消息都會發生這種情況,直到數據庫備份完畢。所以在這段時間裏我不會阻止我的消費者。我發現我的數據庫連接的唯一方法是備份,如果我使用消息並且無法拋出異常。 – 75inchpianist

3

確認特定消息未由JMS規範定義。因此,一些JMS實現者提供每個消息傳遞確認,而另一些則不提供。您將需要檢查您的JMS提供者文檔。

消息隊列通常具有對消息是如何傳遞給客戶端的選項,可以是先入先出(FIFO)或基於優先級的。選擇FIFO選項,以便所有消息按照它們進入隊列的順序傳送。當數據庫脫機並返回時,請調用恢復方法重新以相同順序重新傳送所有消息。