Java 如何在成功处理驼峰内部重新传递后防止来自MQ代理的消息重新传递(事务性驼峰路由)
我正在尝试使用JPATransactionManager运行camel transaction()路由(一个独立的java进程),它是spring平台TransactionManager(因为我希望camel路由在单个DB事务中运行),但如果事务方法失败,即使我使用了handle(true),我也无法禁止从MQ Broker重新交付在OneException子句中以及我的自定义重新交付策略(已成功执行)。我只希望MQ在出现服务崩溃时重新传递 已在下面尝试,但不起作用:Java 如何在成功处理驼峰内部重新传递后防止来自MQ代理的消息重新传递(事务性驼峰路由),java,apache-camel,spring-transactions,camel-jms,Java,Apache Camel,Spring Transactions,Camel Jms,我正在尝试使用JPATransactionManager运行camel transaction()路由(一个独立的java进程),它是spring平台TransactionManager(因为我希望camel路由在单个DB事务中运行),但如果事务方法失败,即使我使用了handle(true),我也无法禁止从MQ Broker重新交付在OneException子句中以及我的自定义重新交付策略(已成功执行)。我只希望MQ在出现服务崩溃时重新传递 已在下面尝试,但不起作用: 在JMSComponen
- 在JMSComponent配置中设置setTransact(false)以防止驼峰jms运行是Transact_会话jms模式,但它不起作用
- doTry和doCatch从事务块中删除异常
- 驼峰再交付,随后为已处理(正确)
- 我希望camel会按照重新交付策略尝试重新交付(有效),但MQ不应重新交付
- 我希望我的驼峰路由在单个db事务中运行
- 我希望MQ代理仅在我的java服务在处理过程中崩溃时重新提交,这样我就不会丢失消息
AcknowledgementModelName=CLIENT\u ACKNOWLEDGE
或显式设置AUTO\u ACKNOWLEDGE
(默认值)
只要消息未被确认,就不会从代理的角度传递消息AUTO_ACKNOWLEDGE
在消费后立即确认信息,如果您从未想要重新交付,这是有意义的
客户端确认
另一方面,仅在特定条件下确认消息,请参阅
编辑由于评论与新信息
如果您希望MQ重新交付,但在大多数情况下使用Camel“覆盖”它们,则必须使用已处理的消息
通过如下配置JMS组件,使用本地JMS代理事务
jmsComponent.setLazyCreateTransactionManager(false);
jmsComponent.setTransacted(true);
对于这种类型的事务,您根本不需要Spring TransactionManager。因此,我猜JMS会忽略JPATransactionManager
,您的JMS消费应该是事务性的
现在,当您的Camel错误处理程序通过使用handled(true)
来“吞咽”异常时,必须没有MQ重新交付。但当异常传播回代理时,MQ会重新传递
我希望我的驼峰路由在单个db事务中运行
在您的问题中,我没有发现任何关于不处理数据库事务的内容。似乎只有一个处理器可以处理数据库。如果这不正确,请在您的问题或单独的问题中描述问题
我希望camel会按照重新交付策略尝试重新交付(有效),但MQ不应重新交付
当MQ决不能执行重新传递时(因为您在Camel中处理错误),您应该删除AcknowledgementModelName=CLIENT\u ACKNOWLEDGE
或显式设置AUTO\u ACKNOWLEDGE
(默认值)
只要消息未被确认,就不会从代理的角度传递消息AUTO_ACKNOWLEDGE
在消费后立即确认信息,如果您从未想要重新交付,这是有意义的
客户端确认
另一方面,仅在特定条件下确认消息,请参阅
编辑由于评论与新信息
如果您希望MQ重新交付,但在大多数情况下使用Camel“覆盖”它们,则必须使用已处理的消息
通过如下配置JMS组件,使用本地JMS代理事务
jmsComponent.setLazyCreateTransactionManager(false);
jmsComponent.setTransacted(true);
对于这种类型的事务,您根本不需要Spring TransactionManager。因此,我猜JMS会忽略JPATransactionManager
,您的JMS消费应该是事务性的
现在,当您的Camel错误处理程序通过使用handled(true)
来“吞咽”异常时,必须没有MQ重新交付。但当异常传播回代理时,MQ会重新传递
我希望我的驼峰路由在单个db事务中运行
在您的问题中,我没有发现任何关于不处理数据库事务的内容。似乎只有一个处理器可以处理数据库。如果此操作不正确,请在您的问题或单独的问题中描述问题。根据应按预期进行doTry和doCatch操作。您案例中的问题可能是触发错误场景的异常。仅(无RuntimeException或其后代)不标记正在进行的事务以进行回滚。根据doTry和doCatch应按预期工作。您案例中的问题可能是触发错误场景的异常。仅(无RuntimeException或其后代)不将正在进行的事务标记为回滚。我只希望MQ在java服务崩溃时重新提交,而我无法使用自动确认模式实现这一点。单db事务部分工作正常。我只希望MQ在java服务崩溃的情况下重新提交,这是我无法用AUTO_ACKNOWLEDGE模式实现的。单个db事务部分工作正常。