如果我正确理解 Spring 文档,请解释一下。
Spring 文档指出:https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#jms-tx https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#jms-tx
(...)当您在非托管环境中使用 JmsTemplate 时,您可以指定这些值(事务和确认模式)通过使用属性 sessionTransacted 和 sessionAcknowledgeMode。
当您将 PlatformTransactionManager 与 JmsTemplate 一起使用时,模板始终会获得一个事务性 JMS 会话。(..)
(顺便说一句,这是真的 - 会话是事务性的)
Javadoc 指出:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jms/core/JmsTemplate.html https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jms/core/JmsTemplate.html
JMS 会话的默认设置是“不进行事务处理”和“自动确认”。根据 Java EE 规范的定义,当在活动事务内创建 JMS 会话时,事务和确认参数将被忽略,无论是 JTA 事务还是事务Spring管理的事务.
据我所知,如果事务处于活动状态,JMS 模板会话事务设置将被忽略 -那是真实的- 并且会话应参与活跃交易 -那不是真的.
我调试了为什么它不正确,我发现:https://github.com/spring-projects/spring-framework/blame/master/spring-jms/src/main/java/org/springframework/jms/connection/ConnectionFactoryUtils.java#L353 https://github.com/spring-projects/spring-framework/blame/master/spring-jms/src/main/java/org/springframework/jms/connection/ConnectionFactoryUtils.java#L353
if (resourceHolderToUse != resourceHolder) {
TransactionSynchronizationManager.registerSynchronization(
new JmsResourceSynchronization(resourceHolderToUse, connectionFactory,
resourceFactory.isSynchedLocalTransactionAllowed()));
resourceHolderToUse.setSynchronizedWithTransaction(true);
TransactionSynchronizationManager.bindResource(connectionFactory, resourceHolderToUse);
}
线路resourceHolderToUse.setSynchronizedWithTransaction(true)
是对齐文档。
这里的问题是:resourceFactory.isSynchedLocalTransactionAllowed()
Because resourceFactory
是 org.springframework.jms.core.JmsTemplate.JmsTemplateResourceFactory#isSyncchedLocalTransactionAllowed 指向JmsTemplate#sessionTransacted
.
结论:
根据文件,如果交易活跃,JmsTemplate#sessionTransacted
应该被忽略。但事实并非如此——尽管会话是事务性的,但不能不参与提交。
JmsTemplate#sessionTransacted
最终映射到ConnectionFactoryUtils.JmsResourceSynchronization#transacted
并且 default=false 防止在事务结束时调用提交(JmsResourceSynchronization“认为”它不参与事务)
我对文档的理解是否正确并且这里确实存在错误?