JMS API將我驅動到精神崩潰的地步。輪詢jms隊列的消息並明確確認每條消息已被正確處理的正確方法是什麼?JMS - 如何正確實現消息接收器與明確的確認?
我應該在上述場景中創建一個「事務處理會話」以及哪種確認模式是正確的?
我的設計約束:
- 重複傳送是沒有問題
- 性能不是主要關心的問題
- 在地板上刪除郵件是不能接受的
- 我寧願不添加一個依賴Spring-JMS
JMS API將我驅動到精神崩潰的地步。輪詢jms隊列的消息並明確確認每條消息已被正確處理的正確方法是什麼?JMS - 如何正確實現消息接收器與明確的確認?
我應該在上述場景中創建一個「事務處理會話」以及哪種確認模式是正確的?
我的設計約束:
JMS中有3種類型的消息確認類型:
DUPS_OK_ACKNOWLEDGE
- 如果JMS提供程序發生故障,會自動對消息進行自動延遲確認,這可能會導致重複消息。
AUTO_ACKNOWLEDGE
- 客戶端應用程序明確承認消息 - 當消息被傳遞到應用
CLIENT_ACKNOWLEDGE
會話自動確認。
根據您的要求,我認爲您可以選擇CLIENT_ACKNOWLEDGE
,因爲它允許您的應用程序明確確認消息。但是您必須注意,在某些JMS提供程序中,確認消費的消息會自動確認收到其會話已傳遞的所有消息。但是,一些JMS提供者確實實現了每個消息確認。
您擁有的其他選項是使用確認模式無效的事務處理會話。在事務處理會話中,僅當應用程序調用commit
時纔會從隊列中刪除消息。如果會話呼叫rollback
或結束呼叫commit
,則自上一次commit
呼叫以來傳送到應用程序的所有消息都將重新出現在隊列中。