2013-06-27 60 views
0

我有一個關於JMS和Spring集成的問題。一些Spring JMS問題

我有3個隊列,我們​​稱之爲QUEUE_SOURCE,QUEUE_TARGET和QUEUE_ERROR。 DefaultMessageListenerContainer用於讀取來自QUEUE_SOURCE的消息。

我爲這些隊列配置了JMS事務管理器。

當我從QUEUE_SOURCE讀取數據時發生了錯誤,但是在將消息發佈到QUEUE_TARGET時,我發現 可能會在引發異常之前重試幾次消息,觸發回滾。

我猜會發生什麼情況是這樣的:

1)開始交易 2)閱讀消息 3)嘗試張貼在目標隊列QUEUE_TARGET消息,但未能 4)不要因爲錯誤的承諾,所以消息不從QUEUE_SOURCE

OR

1)啓動事務 2)讀消息 3)從QUEUE_SOURCE 4取出消息中去除)嘗試張貼在目標闕消息ue QUEUE_TARGET,但失敗 5)將消息放回QUEUE_SOURCE

所有重新輸入失敗後,會觸發回滾。

但是,在回滾過程中會發生什麼讓我困惑。 我不知道消息何時結束,它肯定不會在源隊列中結束,也不會在錯誤隊列中結束。那麼在這個回滾過程中究竟發生了什麼?

回答

0

你需要顯示你的確切配置,但是你的猜測#1是接近的;代理將傳遞消息,但在提交之前不會將其從隊列中移除。如果您的代碼拋出異常,框架將執行session.rollback(),代理將重新傳遞。如果交付成功,框架將提交交易,然後才能刪除該消息。

+0

感謝您的回答。我想知道的是,在回滾期間會發生什麼?如果消息在提交之前未被刪除,那麼回滾到底是做什麼的? – DKIT

+0

這真的取決於經紀人如何實際執行;解決它是供應商的問題。從邏輯上講,消息在回滾之後會重新出現在隊列的頭部。無論是實際移除並重新打開還是標記爲「正在進行」取決於供應商。 –