2010-04-07 91 views
12

我使用Spring 2.5和實現MessageListener的自定義類。如果在我的onMessage()方法中引發JmsException,那麼隊列的狀態會發生什麼變化?當onMessage()拋出JMSException時,JMS隊列上會發生什麼?

在消息被調用的那一刻,消息是否被隊列視爲「傳遞」了?或者JmsException觸發某種回滾,並且消息被重新輸入到隊列中?

在此先感謝!

回答

13

從JMS 1.1規範...

4.5.2異步傳送

客戶端可以註冊一個實現用的MessageConsumer的JMS MessageListener接口的對象。當消息到達消費者時,提供者通過調用監聽器的onMessage方法來傳遞它們。

偵聽器可能拋出RuntimeException;但是,這被認爲是客戶端編程錯誤。行爲良好的監聽者應該捕獲這些異常並嘗試轉移消息,導致他們轉向某種形式的特定於應用程序的「不可處理的消息」目標。

偵聽器拋出RuntimeException的結果取決於會話的確認模式。

  • AUTO_ACKNOWLEDGE或 DUPS_OK_ACKNOWLEDGE - 消息 將立即重新傳遞。 JMS提供商將 在 放棄之前重新傳遞相同消息的次數取決於提供程序。在這些情況下,將針對重新發送的消息 設置JMSRedelivered消息報頭字段 。
  • CLIENT_ACKNOWLEDGE - 傳遞偵聽器的下一條消息 。如果一個 客戶端希望重新發送前一個 未確認消息,那麼它必須手動恢復該會話。
  • 已處理會話 - 傳遞偵聽器的下一條消息 。 客戶端可以提交或回滾 會話(換句話說, RuntimeException不會自動回滾會話 )。

JMS提供程序應該標記客戶端的消息偵聽器正在拋出 RuntimeExceptions可能有故障。

+0

如果在onMessage中發生未處理的異常並且方法永不返回,會發生什麼?是否有可能不會從隊列中刪除消息?這是否意味着(對於同步客戶端)onMessage必須返回確認信息,以便可以從隊列中刪除消息? – bluelurker 2016-02-01 18:06:30

+0

@bluelurker - 我很困惑你的問題。 spec語言是關於允許RuntimeException從onMessage()方法傳播出去的。如果您的方法通過拋出異常完成,那麼這是「正常」返回的替代方法。所以我不明白「永不回頭」的部分。它不會返回,而是通過傳播一個異常來完成。 – 2016-02-11 19:55:46

+0

@JohnM從onMessage()方法,如果我拋出RunTimeException那麼該消息將保持隊列,並再次交付。再一次的消息將被拋出。它會再次交付。等等....我的理解是正確的嗎?這是我在測試中看到的情況。 – 2017-06-04 10:07:29

相關問題