Spring   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了java – Spring同步Hibernate和JMS事务大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在使用一个同时使用JMS和Hibernate的应用程序.

文档建议如果我想在两个资源之间进行交易,则必须使用JTA.

但是,现在使用@transaction带注释的DAO方法(和HibernatetransactionManager),这似乎已经起作用了.当我在jmstemplate调用send()时,消息不会立即发送,而是在方法返回时使用Hibernate会话提交JMS会话.

如果没有JtatransactionManager,我不知道这是怎么可能的,所以我检查了源代码.事实证明,Hibernate和jmstemplate的包装器都会使用transactionSynchronizationManager注册会话,并且在Hibernate会话提交时将提交JMS会话.

这和JTA交易有什么不同.我可以用它来取代后者吗?

最佳答案
简而言之,如果没有JTAtransactionManager和Xa感知数据源,您将无法获得对两阶段提交的支持.

您目击的是仅支持单阶段提交的两个本地事务的协调.大致执行这一系列事件……

>启动JMS事务
>读取JMS消息
>启动JDBC事务
>写入数据库
>提交JDBC事务
>提交/确认JMS

首先将包装嵌套的JDBC事务启动JMS事务,以便在Hibernate / JDBC提交失败时回滚JMS队列.您的JMS侦听器容器应设置为不确认=“auto”,而是在发送确认之前等待Hibernate事务完成.

如果你只有这两个资源,那么你必须虑的问题是当Hibernate成功持久化然后你得到一个Exception才能确认JMS服务器.这不是一个大问题,因为JMS消息不会丢失,您将再次阅读它.

然而

>您必须编写@R_675_8798@geListener来处理来自服务器的重复消息
>您还必须处理由于数据不良而无法处理的消息,并最终导致无限循环尝试使用它.在这种情况下,服务器可能配置为将消息移动到“死消息队列”,或者您自己在@R_675_8798@geListener中处理此消息

其他选项和进一步阅读

如果您的JMS服务器不支持XA(全局)事务,那么这几乎是您唯一的解决方案.

如果JMS服务器支持XA事务但JDBC不支持,那么您可以使用JTAtransactionManager并使用LastResourceCommitOptimisation.您可以使用像JOTM这样的开源JTAtransactionManagers

This JavaWorld article详细介绍了您的问题空间.

大佬总结

以上是大佬教程为你收集整理的java – Spring同步Hibernate和JMS事务全部内容,希望文章能够帮你解决java – Spring同步Hibernate和JMS事务所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。