Spring boot Spring集成JMS-Spring代码在运行时异常时提交

Spring boot Spring集成JMS-Spring代码在运行时异常时提交,spring-boot,spring-integration,azureservicebus,spring-jms,azure-servicebus-queues,Spring Boot,Spring Integration,Azureservicebus,Spring Jms,Azure Servicebus Queues,我想问问有经验的Spring集成开发人员,甚至是代码作者,关于我在代码中遇到的奇怪行为。问题是Spring代码在我的RuntimeException上执行COMMIT。下面是我的设置: 一,。 我使用配置了标准JMS入站通道适配器 <jms:message-driven-channel-adapter /> 我有一个transactionManager,它实现了Best effort 1PC模式,即春季可用的ChainedTransactionManager Im在简单测试流中

我想问问有经验的Spring集成开发人员,甚至是代码作者,关于我在代码中遇到的奇怪行为。问题是Spring代码在我的RuntimeException上执行COMMIT。下面是我的设置:

一,。 我使用配置了标准JMS入站通道适配器

<jms:message-driven-channel-adapter />

  • 我有一个transactionManager,它实现了Best effort 1PC模式,即春季可用的ChainedTransactionManager

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

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

    我有什么错

    现在我已经再次阅读了代码,甚至Spring代码也将状态设置为RollbackOnly并执行一些异常处理程序,但最后它仍然成功地继续,并最终调用了提交行,如屏幕截图所示,chainedTransactionManager也指示其本地TMs提交

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

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


    看起来我不理解TM逻辑。甚至commit方法也将状态作为arg。并且可以做回滚。我认为这些方法是排他性的——commit做commit,rollback做rollback。然而,当查看跟踪日志时,我仍然不知道为什么会提到嵌套事务并恢复一些挂起的事务。在我的设置中,我应该在JMS接收操作上启动单个事务。听起来最好与我们共享您的配置。不清楚如果只涉及JMS,为什么需要一个
    ChainedTransactionManager
    …哦,我想我已经包含了信息,对不起-这是数据库中消息驱动更新的实现。所以有两个资源JMS和JDBC。无论如何,它看起来工作正常,我只是混淆了rollback方法不是直接调用的,而是在TransactionStatus设置为rollback的情况下调用commit。我认为打开两个事务——首先是JMS资源,然后是JDBC资源——自动意味着嵌套事务,其中JDBC是内部事务。对吗?如果是的话,那么一切都应该是好的。这是正确的:我们有一个虚假的顶级链式事务,这些JMS和JDBC嵌套在其中。