簡體   English   中英

如何在將JMS消息發送到下一個隊列之前強制DB更新

[英]how to force DB update before sending the JMS message to next queue

我在Weblogic 11g容器上的Java JMS配置中有一個簡單的用例(使用Spring 3.x框架進行依賴注入,並使用EJB 2.x用於MDB和ejb-jar.xml中的聲明式事務管理)。

  1. 從隊列1中讀取消息
  2. 將消息解組到Java對象中
  3. 將未編組的Java對象保存到數據庫表中
  4. 將消息(包含來自step_3的object-id)發送到下一個隊列2
  5. 閱讀queue-2上的消息(並根據對象的id從數據庫中加載對象)

我的問題是,在很多情況下,在第5步中,我發現數據庫中還沒有object-id,我拋出了異常,消息循環返回並重新嘗試,最終object_id顯示在數據庫中並且第5步中的消息已成功處理。

涵蓋步驟1-4(在MDB中實現)的工作流在ejb-jar.xml中具有“必需”的事務划分,並且連接工廠啟用了XA。 這意味着工作流(步驟1-4)必須在事務中運行,當消息最終在步驟4中發送到隊列2時,該事務必須提交。

那么為什么在很多情況下,步驟5為什么在數據庫中找不到對象ID。 有什么辦法可以迫使我避免或減少在第5步中收到此錯誤。

如果您在很多情況下說在第5步中,該對象不在db中,則很可能在進入第5步時該事務未提交。

如果您在從隊列2中讀取消息之前等待事務的結果,該怎么辦?如果這是2個不同的進程,則可以通知另一台機器:隊列1中的所有消息均已傳遞,並且可以繼續進行處理了。從隊列2中讀取消息。

我一直在尋找使用weblogic容器的解決方案。 我發現此設置在weblogic控制台中稱為“ 交貨時間覆蓋”-定義為默認延遲,即從生成消息到在目標目標上顯示消息之間的默認延遲,無論由郵件發送者指定的發送時間如何。生產者和/或連接工廠

time-to-deliver-override-link我將此值設置為3-4秒,並且此問題減少了90%。

只需在此處粘貼此信息,以便其他人可以從中受益。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM