首页 > 解决方案 > Spring Integration JMS - Spring 代码确实在 RuntimeException 上提交

问题描述

我想向经验丰富的 Spring Integration 开发人员甚至代码作者询问我在代码中遇到的奇怪行为。问题是 Spring Code 在我的 RuntimeException 上执行 COMMIT。所以这是我的设置:

1. 我有使用配置的标准 JMS 入站通道适配器

<jms:message-driven-channel-adapter />
  1. 我有实现 Best effort 1PC 模式的事务管理器 - 在 Spring 中可用的一个,ChainedTransactionManager。

  2. 我在简单的测试流程中使用消息,其中 JMS 入站适配器仅发布到直接通道,并通过一个转换器端点将转换后的消息发布到另一个直接端点,其中作为 ServiceActivator 的处理程序故意抛出我的应用程序异常,该异常扩展了 RuntimeException。

现在,当我调试整个流程以及单步执行 Spring 内部代码时,我总是在配置的事务管理器调用 COMMIT 的地方结束,因此我的 ChainedTransactionManager 也会执行 COMMIT,尽管我正在模拟错误并因此清除回滚场景。回滚方法中的断点根本没有命中。

我有什么错?

现在我再次浏览了代码,甚至 Spring 代码将状态设置为 RollbackOnly 并执行一些异常处理程序,但最后它仍然成功并最终调用提交行,如屏幕截图所示,chainedTransactionManager 指示其本地 TM承诺以及。

我希望有一些我无法发现的细节/错误:) 谢谢!

类 .m2\repository\org\springframework\spring-jms\5.2.3.RELEASE\spring-jms-5.2.3.RELEASE-sources.jar!\org\springframework\jms\listener\AbstractPollingMessageListenerContainer.java 的屏幕截图

在此处输入图像描述

标签: spring-bootspring-integrationazureservicebusspring-jmsazure-servicebus-queues

解决方案


推荐阅读