2015-09-02 58 views
0

我有一個與持久性JMSActiveMQ)隊列集成的Java/Akka應用程序。用Akka耐用郵箱處理事務性消息

PersistentQueue包含包含批處理作業的JMS/ActiveMQ隊列。所以,如果服務器在任務執行過程中,則作業將在重新啓動時保持下降的消息在事務中收到的。如果作業成功完成或由用戶則此事務被提交到永久刪除消息取消,如果再作業失敗的事務回滾(將在隊列前面的消息),如果作業已執行較少比MAX_RETRY倍。

BatchManager是與REST控制器的接口。由於作業執行期間調用的存儲過程施加的限制,它一次只能執行一個批處理作業。 BatchManager從控制器接收作業,並將它們發送到PersistentQueue以放入JMS隊列,然後在作業排隊(除非另一個作業正在執行)或作業完成時輪詢PersistentQueue以獲取新作業。

我想刪除JMS隊列以及處理其JMSExceptions的所有複雜問題,並將其替換爲BatchManager的耐用郵箱。問題是,我不知道我怎麼能複製JMS事務具有持久郵箱 - 我的理解是,如果服務器作業執行則該消息被永遠失去了(而不是被放回到隊列中時下降JMS隊列)。

是否有辦法通過Akka持久性郵箱實現事務性消息處理,以便在正在執行的服務器出現故障時消息不會丟失?

回答

1

Akka documentation說:

耐用的郵箱是像任何其他郵箱不太可能是事務性的。這是可能的,如果演員崩潰收到消息後,但在完成它的處理之前,該消息可能會丟失。

但也有另一種類型的郵箱 - 帶明確確認郵箱(又名PeekMailbox)。 Here你可以找到使用示例。而here是實現源代碼。

我認爲你可以通過實現自定義持久郵箱來實現你的目標,該郵箱擴展了一些現有的實現,並用PeekMailbox功能對其進行了擴充。