JMSTemplate 中的 setSessionTransacted 到底意味着什么?

2023-12-31

如果我正确理解 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“认为”它不参与事务)

我对文档的理解是否正确并且这里确实存在错误?


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

我只是认为 Spring 管理的事务是由platformTransactionManager. But:

  1. If platformTransactionManager is JtaTransactionManager并且交易开始了,它ISSpring管理事务; JMS 模板属性会话已处理被忽略并且 JMS 模板是事务的一部分
  2. if platformTransactionManager is DataSourceTransactionManager or JpaTransactionManager then
    • if sessionTransacted为 false,JMS 模板不在事务中
    • if sessionTransacted为 true 时,JMS 模板与事务同步:在 JDBC/JPA 事务回调/回滚之后,在 JMS 事务上调用对应的提交/回滚
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JMSTemplate 中的 setSessionTransacted 到底意味着什么? 的相关文章

随机推荐

  • 以理智、安全、高效的方式复制文件

    我寻找一种复制文件 二进制或文本 的好方法 我已经写了几个示例 每个人都可以工作 但我想听听经验丰富的程序员的意见 我缺少好的例子并寻找一种与 C 一起使用的方法 ANSI C WAY include
  • 媒体查询不起作用

    有谁知道为什么我的媒体查询代码不起作用 div class box div box background color red width 100 height 50px media only screen and max device wi
  • 在 Ubuntu 16.04 上运行简单的 .Net Core MVC 应用程序时出现内部服务器错误

    我在 Ubuntu 上使用 Net core 1 0 运行简单的 hello world 应用程序时遇到内部服务器错误 我确信我错过了一些简单的东西 但无法弄清楚它是什么 它一直在工作 直到我更换return Content Hello w
  • ReferenceError:WebAssembly 未定义

    我在应用程序中使用 t test Node js 模块 由于更新 我尝试使用更新版本 电子邮件受保护 cdn cgi l email protection 当模块开始计算数据时出现错误 ReferenceError WebAssembly
  • 从 ConcurrentDictionary 中安全删除列表映射[重复]

    这个问题在这里已经有答案了 我有一个 ConcurrentDictionary 它将简单类型映射到列表 var dict new ConcurrentDictionary
  • 计算卷积的最快方法

    我必须对许多图像的每一行应用卷积滤波器 经典的是 1024x1024 像素的 360 度图像 在我的用例中 它是 720 张 560x600 像素的图像 问题是我的代码比文章中宣传的慢得多 我实现了朴素卷积 需要2m 30s 然后我使用 f
  • Perl 子例程数组和标量变量参数

    我到底如何将标量变量和数组变量传递给 Perl 中的子例程 my currVal 1 my currValTwo 1 my currArray one two three my currArrayTwo one two three mysu
  • 交换 PostgreSQL 中的列值

    In my PostgreSQL数据库 我有一个包含两个文本值的表 t1 and t2 id t1 t2 1 abcd xyz 2 aazz rst 3 fgh qwerty 我想交换列的值t1 and t2对于表中的每一行 使用上面的示例
  • Chrome远程调试显示设备但不检查链接

    我想在 Chrome 上远程调试 Android 应用程序 我的设备是 Qmobile A11 Note 配备 Android v4 0 4 Google Chrome v42 和 Cordova v3 7 我已在我的设备上启用 USB 调
  • Android:将变量传递给已运行的服务

    我在将值从活动传递到已运行的服务时遇到问题 我想知道最好的方法是什么 添加额外内容不起作用 因为我相信这必须在意图开始之前完成 如我错了请纠正我 任何帮助都会很棒 如果需要的话我可以详细说明 Dan 如果您的服务不是IntentServic
  • 如何将 NTLM 身份验证与 Active Directory 结合使用

    我正在尝试在我们的内部站点之一上实施 NTLM 身份验证 一切正常 我不知道的一个难题是如何从 NTLM 获取信息并使用 Active Directory 进行身份验证 有一个NTLM 的良好描述 http www innovation c
  • PHP 关闭:无法写入文件?

    我使用 Log 类在执行期间存储消息 然后应该在关闭时将这些消息写入文件 使用 register shutdown function 但由于某种原因 我总是收到 file put contents 无法打开流 没有这样的文件或目录 文件不存
  • 使 Visual Studio 在项目文件更改时自动重新加载解决方案

    在我正在处理的当前项目中 目前存在大量代码变动 这意味着从源代码管理进行更新有时可能意味着许多 csproj 文件更改 众所周知 VS2010没有 Reload all 按钮 但是你必须重新加载每个项目并确认每次重新加载 有没有一种方法可以
  • 我想将 sqlite3 db 从内存复制到硬盘。我能怎么做? [复制]

    这个问题在这里已经有答案了 我想将 sqlite 数据库从内存复制到硬盘 我能怎么做 我尝试这样 conn phy sqlite3 connect phy db conn sqlite3 connect memory c conn curs
  • OpenCV C/C++ 中仅过滤出一个轮廓

    我正在尝试编写一个程序 使用基于 Canny 过滤器和轮廓查找功能的摄像机 网络摄像头来检测任何形状的物体 这是我的程序 int main int argc char argv CvCapture cam CvMoments moments
  • 自定义异常过滤器在 asp.net MVC 中未被命中

    我有一个自定义异常过滤器 用于捕获我编写的自定义异常 但由于某种原因 当我抛出异常时 它永远不会到达过滤器 相反 我只是收到一个错误 表明我的异常未由用户代码处理 任何人都可以提供一些关于我应该如何设置的建议 帮助吗 相关代码如下 cont
  • 在 QT 中显示(渲染)字符串中的 HTML

    我在 QString 中有 html 我可以使用什么小部件来显示它 QWebView不是必需的 因为我不访问互联网 QWebView http doc qt io qt 4 8 qwebview htmls setHtml http doc
  • ReSharper:查找可选参数的用法

    如果我有一个带有可选参数的函数 是否有一种简单的方法可以找到我的代码中调用该函数并将值传递给该参数的所有位置 该函数有许多非默认参数 因此扫描调用该函数的位置的通常查找用法结果是有问题的 因为它会修剪行 并且我看不到是否使用了可选参数 Wi
  • 快速获得多个链表的部分排序的算法

    我有一个情况 如下 I have n双向链表 每个列表都有一个哨兵开始和结束 这些列表都有same开始和结束节点 不是必需的 但为了简单起见 这些列表是同质的并且可能共享项目 我想找到所有节点的部分排序n列表 从开始节点开始 到结束节点结束
  • JMSTemplate 中的 setSessionTransacted 到底意味着什么?

    如果我正确理解 Spring 文档 请解释一下 Spring 文档指出 https docs spring io spring docs current spring framework reference integration html