簡體   English   中英

成功處理駱駝內部重新傳遞(交易的駱駝路由)之后,如何防止從MQ Broker重新傳遞消息

[英]How to prevent message redelivery from MQ Broker after camel internal redeliveries are successfully processed (transacted camel route)

我試圖用JPATransactionManager運行駱駝transacted()路由(一個獨立的Java進程)是spring PlatformTransactionManager(因為我希望駱駝路由在單個DB事務中運行),但是我無法禁止從MQ Broker重新交付即使我在onException子句中使用了handle(true)以及我的自定義重新交付策略(成功執行),事務方法也會失敗。 我只希望在服務崩潰時重新交付MQ。

在下面嘗試過,但是不起作用:

  • 在JMSComponent配置中設置setTransacted(false)以防止駱駝jms運行是transacted_session jms模式,但它不起作用
  • doTry和doCatch事務塊中的異常
  • 駱駝重新交付,然后處理(true)。

     onException(Exception.class) .log("ERROR OCCURRED") .redeliveryPolicyRef("myRedeliveryPolicy") .handled(true) .to(getPostExceptionRoute()); @Bean @Autowired public RedeliveryPolicy myRedeliveryPolicy() { RedeliveryPolicy myRedeliveryPolicy= new RedeliveryPolicy(); myRedeliveryPolicy.setMaximumRedeliveries(2); myRedeliveryPolicy.setMaximumRedeliveryDelay(2000); return myRedeliveryPolicy; } @Bean @Autowired public JmsComponent jms(IJMSConnectionFactory cf) throws JMSException { JmsComponent jmsComponent = new JmsComponent(); jmsComponent.setConfiguration(jmsConfig(cf)); jmsComponent.setTransacted(false); return jmsComponent; } from("jms:queue:TestQueue?acknowledgementModeName=CLIENT_ACKNOWLEDGE") .unmarshal().json(JsonLibrary.Jackson, TestObject.class) .transacted() .processRef("myPersistInDBProcessor") 
  • 我希望駱駝按照重新交付策略(有效)嘗試重新交付,但是MQ不應該重新交付。

  • 我希望我的駱駝路線可以在單個數據庫事務中運行。
  • 我希望僅當我的Java服務在處理過程中崩潰時,MQ Broker才能重新交付,這樣我才不會丟失消息。

我希望駱駝按照重新交付策略(有效)嘗試重新交付,但是MQ不應該重新交付

當MQ 絕不能進行重新交付時(因為您處理了Camel中的錯誤),您應該刪除AUTO_ACKNOWLEDGE acknowledgementModeName=CLIENT_ACKNOWLEDGE或顯式設置AUTO_ACKNOWLEDGE (默認值)。

只要不確認消息,就不會從代理角度傳遞消息。 AUTO_ACKNOWLEDGE立即承認消費后的消息,如果你從來沒有想重復傳遞情理之中的事情。

另一方面, CLIENT_ACKNOWLEDGE僅在某些條件下確認消息, 有關此的更多信息 ,請參見此文章

由於評論帶有新信息而進行編輯

如果要MQ重新交付,但在大多數情況下用Camel“覆蓋”它們,則必須使用已處理的消息

通過像這樣配置您的JMS組件來使用本地JMS代理事務

jmsComponent.setLazyCreateTransactionManager(false);
jmsComponent.setTransacted(true);

對於這種類型的事務,您根本不需要Spring TransactionManager。 因此,我想JPATransactionManager忽略 JPATransactionManager 並且您的JMS使用應該是事務性的。

現在,當您的駱駝錯誤處理程序通過使用handled(true) “吞下”異常時,必須沒有MQ重新交付。 但是,當將異常傳播回代理時,MQ會重新交付。

我希望我的駱駝路線可以在單個數據庫事務中運行

在您的問題中,我沒有找到任何有關無法正常工作的數據庫事務的信息。 似乎只有一個處理數據庫的處理器。 如果無法正常工作,請在您的問題或單獨的問題中描述問題。

根據Apache Karaf事務指南 ,doTry和doCatch應該按預期工作。 在您的情況下,可能是異常觸發了錯誤情況。 檢查異常 (沒有RuntimeException或其后代)不會將正在進行的事務標記為回滾。

暫無
暫無

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

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