我正在尝试使用 JPATransactionManager 运行 camel transacted() 路由(独立的 java 进程)是 spring PlatformTransactionManager (因为我希望骆驼路由在单个 DB 事务中运行)但我无法禁止从 MQ Broker 重新传递以防万一即使我在 onException 子句中使用了handled(true) 以及我的自定义重新交付策略(成功执行),事务方法也会失败。我只希望 MQ 在服务崩溃时重新交付。
在下面尝试但它不起作用:
- 在 JMSComponent 配置中设置 setTransacted(false) 以防止骆驼 jms 运行是 transacted_session jms 模式,但它不起作用
- doTry 和 doCatch 来自事务块的异常
骆驼重新交付,然后是处理(真)。
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 不应该重新交付。
- 我希望我的骆驼路线在单个数据库事务中运行。
- 我希望 MQ 代理仅在我的 java 服务在处理过程中崩溃时重新传递,这样我就不会丢失消息。