Java 如何在成功处理驼峰内部重新传递后防止来自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

我正在尝试使用JPATransactionManager运行camel transaction()路由(一个独立的java进程),它是spring平台TransactionManager(因为我希望camel路由在单个DB事务中运行),但如果事务方法失败,即使我使用了handle(true),我也无法禁止从MQ Broker重新交付在OneException子句中以及我的自定义重新交付策略(已成功执行)。我只希望MQ在出现服务崩溃时重新传递

已在下面尝试,但不起作用:

  • 在JMSComponent配置中设置setTransact(false)以防止驼峰jms运行是Transact_会话jms模式,但它不起作用
  • doTry和doCatch从事务块中删除异常
  • 驼峰再交付,随后为已处理(正确)

  • 我希望camel会按照重新交付策略尝试重新交付(有效),但MQ不应重新交付

  • 我希望我的驼峰路由在单个db事务中运行
  • 我希望MQ代理仅在我的java服务在处理过程中崩溃时重新提交,这样我就不会丢失消息
我希望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事务中运行

在您的问题中,我没有发现任何关于不处理数据库事务的内容。似乎只有一个处理器可以处理数据库。如果这不正确,请在您的问题或单独的问题中描述问题

我希望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事务部分工作正常。