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