2016-11-01 49 views
1

代碼...JMS回滾有多可靠?

@Transactional 
@JmsListener(destination = "QueueA") 
public void process(String input) { 
    doSomethingWhichMayThrowException(input); 
} 

考慮以下情況:...

  1. 交易開始(使用Spring @Transactional註釋)從QueueA(隊列使用磁盤中讀取
  2. 持久性JMS消息作爲消息存儲)
  3. 磁盤已滿並且不接受任何寫入操作
  4. 發生異常且事務回滾

消息是否丟失?

如果不是那麼在事務(步驟2)下如何從隊列中讀取消息?

是否使用某種類型的隊列瀏覽器,因此消息是從隊列中讀取的但未消耗?

+0

它是供應商的依賴,但通常它與從驅動程序到messagebroker確認。 –

回答

1

消息是否丟失?

不,消息不會因事務回滾而丟失。

如果不是,那麼在事務 (步驟2)下如何從隊列中讀取消息?

一旦消息監聽器的process()/onMessage()方法完成,並用成功或異常,則內部消息確認返回(默認爲AUTO_ACKNOWLEDGE)發生(這是最後的事情隱含發生)的JMS提供者後(IBMMQ, ActiveMQ,SonicMQ等),它告訴交易成功與否。

如果事務成功,JMS提供程序將從隊列/主題中刪除消息。

如果事務不成功,JMS提供程序會保留該消息(直到消息TimetoLive過期)。

是某種隊列瀏覽器使用,所以消息從隊列中讀取,但 不消耗?

你可以認爲它就像是隊列瀏覽器的概念,但是它取決於JMS提供者的實現,他們如何在內部實現它。爲了實現這一點,消息代理只讀取消息內容,但不要從隊列/主題中刪除實際消息,直到從當前事務的消息監聽器的process()/ onMessage()方法收到確認爲止。