我想请教有经验的Spring集成开发者,甚至是代码作者,关于我的代码所遇到的奇怪行为。问题是Spring代码在我的RuntimeException上执行COMMIT。以下是我的设置。
1.我配置了标准的JMS入站通道适配器,使用了
<jms:message-driven-channel-adapter />
我有一个transactionManager,它实现了Best effort 1PC模式--Spring中可用的ChainedTransactionManager。
我在简单的测试流程中消耗消息,其中JMS入站适配器只发布到直接通道,并通过一个转换端点将转换后的消息发布到另一个直接端点,其中处理程序ServiceActivator故意抛出我的应用程序异常,它扩展了RuntimeException。
现在,当我调试整个流程时,当我走过Spring内部代码时,我总是在配置的事务管理器调用COMMIT的地方结束,因此我的ChainedTransactionManager也执行COMMIT,尽管我模拟错误,因此清楚回滚方案。回滚方法中的断点根本没有被击中。
我可能有什么问题?
现在我又看了一遍代码,即使Spring代码将状态设置为RollbackOnly,并执行了一些异常处理程序,但最后还是成功地进行了,最终它调用了截图上所示的commit行,chainedTransactionManager也指示它的本地TMs提交。
我希望有一些细节上的错误我无法发现:) 谢谢
截图来自类.m2\repository\orgspringframework\spring-jms\5.2.3.RELEASE\spring-jms-5.2.3.RELEASE-sources.jar!\orgspringframework\jms\listener/AbstractPollingMessageListenerContainer.java。