2010-09-23 73 views
1

我有一個單線程消息偵聽器,用於偵聽傳入消息。收到的消息在收到數據庫時會保留在數據庫中。計劃重試關聯的JMS消息

有一個消息與參考A和相關聯的消息B如下它it.In一些奇OCCURENCES,B A之前立即在這種情況下到達時,必須有3retries後一些的「x」相等的間隔,以查看是否A已經到了,然後堅持了協會。

由於消息監聽器是單線程的,所以如果我們讓線程進入休眠狀態,整個系統都會受到影響。所以必須有一個單獨的線程重試。

我們可以使用Quartz作業調度程序用於此目的,以避免處理多線程的問題,並具有的任何以下2種方式持久性存儲,

  1. 附表石英作業3次,並保持軌道在JobDataMap的一個標誌的檢查,如果以前的重試成功,則沒有做任何事情

OR

2.Schedule一個工作,如果重試失敗安排同樣的工作,重試一次,然後返回幾秒鐘後。

石英只能用於重複性工作,並且沒有跨作業的一些狀態信息或者是否有其他更好的方法可以做到這一點。

回答

0

您應該配置您的JMS提供程序以在消息隊列中設置重新傳遞延遲。在您的代碼中,您致電context.setRollbackOnly以中止未通過先決條件檢查的消息。

在這種情況下,代碼執行場景變爲:

  • 消耗「B」,檢查先決條件並檢測缺少
  • 回滾事務和消息返回到隊列中,它會所配置的延遲
  • 消耗和處理下一個消息「A」
  • 的延遲之後後重新輸送時,MDB消耗和進程再次「B」成功
+0

我們實現了基於石英調度器的解決方案,但沒有考慮到這一點。這將是一個更好的方法,因此將其標記爲答案 – Yeshvanthni 2012-02-27 18:11:22