在JMSTemplate中setSessionTransact到底是什么意思?



如果我正确理解了Spring文档,请解释一下。

春季文档指出:https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#jms-tx

(...在非受管环境中使用 JmsTemplate 时,可以通过使用属性 sessionTransact 和 sessionAcknowledgeMode 来指定这些值(事务和确认模式(。

当您将 PlatformTransactionManager 与 JmsTemplate 一起使用时,该模板始终被赋予一个事务性 JMS 会话。(..)

(顺便说一句,这是真的 - 会话是事务性的(

Javadoc 状态 : 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

if (resourceHolderToUse != resourceHolder) {
TransactionSynchronizationManager.registerSynchronization(
new JmsResourceSynchronization(resourceHolderToUse, connectionFactory,

resourceFactory.isSynchedLocalTransactionAllowed()));
resourceHolderToUse.setSynchronizedWithTransaction(true);
TransactionSynchronizationManager.bindResource(connectionFactory, resourceHolderToUse);
}

resourceHolderToUse.setSynchronizedWithTransaction(true)是对齐文档。

这里的问题:resourceFactory.isSynchedLocalTransactionAllowed()

因为resourceFactory是org.springframework.jms.core.JmsTemplate.JmsTemplateResourceFactory#isSynchedLocalTransactionAllowed指向JmsTemplate#sessionTransacted

结论: 根据文档,如果事务处于活动状态,则应忽略JmsTemplate#sessionTransacted。但事实并非如此 - 尽管会话是事务性的,但不能不参与提交。

JmsTemplate#sessionTransacted最终映射到ConnectionFactoryUtils.JmsResourceSynchronization#transacted并且 default=false 阻止在事务结束时调用提交(JmsResourceSync "认为"它不参与事务(

我是否正确理解文档并且这里真的有错误?

在 M. Deinum 的指导下,我做了更多的实验,似乎我错误地理解了术语Spring 管理事务

我只是认为 Spring 管理的事务是由platformTransactionManager启动的。但:

  1. 如果platformTransactionManagerJtaTransactionManager并且事务已启动,则它是Spring管理的事务;JMS 模板属性会话事务处理被忽略,JMS 模板是事务的一部分
  2. 如果platformTransactionManagerDataSourceTransactionManagerJpaTransactionManager
    • 如果sessionTransacted为 false,则 JMS 模板不在事务中
    • 如果sessionTransacted为 true,则 JMS 模板与事务同步:在 JDBC/JPA 事务上回调/回滚后,在 JMS 事务上调用相应的提交/回滚

相关内容

  • 没有找到相关文章

最新更新