我試圖解決以下情形:JMS先前消息確認
我使用消息,而是採取在我根據對正確消息處理系統中的中斷(比如例如數據庫)
我正在使用CLIENT_ACKNOWLEDGE,並且只在沒有引發異常時調用.acknowledge()方法。
當我拋出一個異常,消息未被確認,並且我可以看到建立的未確認隊列時,這可以正常工作。但是,這些消息已經全部交付給消費者。
現在假設數據庫重新聯機,並且任何新消息都被成功處理。所以我打電話給他們。我讀到了這個調用.ackackledge()不僅承認了這個消息,而且還承認了消費者以前收到的所有消息。
這不是我想要的!我需要這些先前未確認的消息被重新發送/重試。我想讓他們在隊列中讓JMS處理重試,因爲在消息「重試消息」中維護一個Collection可能會冒失去這些消息的風險(因爲.ackackledge已經讓所有人都失望了)硬件失敗)。
是否有一種方法可以明確確認特定的消息,而不是「承認所有先前的消息」行爲?
爲了這個工作,我需要關閉我的消費,直到我知道失敗結束。我需要保證消息順序。我什麼時候才能知道致電恢復?我需要等到新消息通過後才能成功處理。在這種情況下,我會在調用恢復來處理以前的消息之前處理一條新消息。 – 75inchpianist
我不確定您的客戶在發生故障時不會如何停止,因爲當tcp連接斷開時您的Connection無效。在失敗後重新連接時,請致電恢復。 –
我與JMS的連接不是失敗的。這是我與數據庫的連接。所以當我消費一條消息時,我試圖將數據從數據庫中提取出來。這會引發異常。所有消息都會發生這種情況,直到數據庫備份完畢。所以在這段時間裏我不會阻止我的消費者。我發現我的數據庫連接的唯一方法是備份,如果我使用消息並且無法拋出異常。 – 75inchpianist