当前位置: 首页 > 知识库问答 >
问题:

JMSTemplate中的SetSessionTransact的确切含义是什么?

太叔鸿博
2023-03-14

(...)当您在非托管环境中使用JmsTemplate时,您可以通过使用属性SessionTransact和SessionAccountingEmode来指定这些值(事务和确认模式)。

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

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

我调试了它不正确的原因,发现:https://github.com/spring-projects/spring-framework/browt/master/spring-jms/src/main/java/org/springframework/jms/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#SessionTransact

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

我对文档理解正确吗?这里真的有bug吗?

共有1个答案

凌志学
2023-03-14

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

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

  • 如果PlatformTransactionManagerJTatransActionManager并且事务已经启动,则它是Spring managed transaction;JMS模板属性SessionTransact被忽略,并且JMS模板是事务的一部分
  • 如果PlatformTransactionManagerDataSourceTransactionManagerJPatransactionManager,则
    • 如果SessionTransact为false,则JMS模板不在Transaction中
    • 如果SessionTransact为true,则JMS模板与事务同步:在JDBC/JPA事务通信程序上的callback/rollback之后,在JMS事务上调用commit/rollback

 类似资料:
  • 这两天我一直在和Git Bash合作。我现在知道了诸如、、、和等基本操作。但我还是不知道Git Bash本身到底是什么! 我已经搜索了很多关于Git Bash的内容,但是我看到的所有站点都集中在它的命令的功能上。我仍然没有为我的问题找到一个好的答案。现在,我想,我在正确的地方得到这个答案!

  • 问题内容: 我是JAVA的新手,因此遇到了这个词。“在方法内部创建的类,在Java中称为本地内部类。如果要调用本地内部类的方法,则必须在方法内部 实例化 该类”。粗体字。任何人都可以帮我解决这个问题。我知道这很尴尬,我应该做更多的研究,但我只是不明白。谢谢。 问题答案: 首先 声明的意思是 : 实例化的 简单含义 是从class创建一个对象 。 什么是物体? 类的实例。从一个类中,我们可以创建许多

  • 问题内容: 我想在同一类对象的各种实例之间共享一个对象。 从概念上讲,在我的程序运行时,类A的所有对象都访问类B的相同对象。 我已经看到这是系统范围的,不鼓励使用它。这是否意味着如果我在实例化类A的对象的同一JVM上运行另一个程序,则这些对象可能会访问与先前程序中访问的对象相同的B对象? 使用静态字段的一般缺陷是什么? 是否有其他选择(不需要大量的实施工作)? 问题答案: 静态不是完全意味着“由所

  • 这听起来可能是一个太基本的问题,但我已经寻找了答案,现在我比以前更困惑了。 在git中将我的分支合并到另一个分支时,“我们的”和“他们的”是什么意思?这两个分支都是“我们的”。 在合并冲突中,“我们的”总是显示的两个版本的上部吗? “我们的”是否总是指合并开始时HEAD指向的分支?如果是这样的话,为什么不使用像“current branch's”这样清晰的所有格指称,而不是使用像“ours”这样在

  • 我在网上搜索了“Gradle classpath site:stackoverflow.com”和“Gradle classpath”,只在以下文件中找到相关信息: Gradle:What is the difference between classpath and compile dependencies? 余登宝的回答是这样写的: 编译'org.hibernate:hibernate-cor

  • 问题内容: 我在Oracle过程中使用诸如“ where 0 =0”之类的语句时有些困惑?有人可以澄清一下吗?即使我们进行动态选择,即使在查询中附加了实际条件,为什么还要添加此语句呢?条件会否影响结果集?..我经历了如何选择列包含字符串中任何单词的所有行?但我完全理解使用“ where 0= 0”的原因。有人可以给我使用这种条件的正确理由吗? 提前致谢..;) 问题答案: 使用动态sql时,可能需