java – Spring同步Hibernate和JMS事务
我正在使用一个同时使用JMS和Hibernate的应用程序. 文档建议如果我想在两个资源之间进行交易,则必须使用JTA. 但是,现在使用@Transaction带注释的DAO方法(和HibernateTransactionManager),这似乎已经起作用了.当我在JmsTemplate上调用send()时,消息不会立即发送,而是在方法返回时使用Hibernate会话提交JMS会话. 如果没有JtaTransactionManager,我不知道这是怎么可能的,所以我检查了源代码.事实证明,Hibernate和JmsTemplate的包装器都会使用TransactionSynchronizationManager注册会话,并且在Hibernate会话提交时将提交JMS会话. 这和JTA交易有什么不同.我可以用它来取代后者吗? 最佳答案
简而言之,如果没有JTATransactionManager和XA感知数据源,您将无法获得对两阶段提交的支持.
您目击的是仅支持单阶段提交的两个本地事务的协调.大致执行这一系列事件…… >启动JMS事务 首先将包装嵌套的JDBC事务启动JMS事务,以便在Hibernate / JDBC提交失败时回滚JMS队列.您的JMS侦听器容器应设置为不确认=“auto”,而是在发送确认之前等待Hibernate事务完成. 如果你只有这两个资源,那么你必须考虑的问题是当Hibernate成功持久化然后你得到一个Exception才能确认JMS服务器.这不是一个大问题,因为JMS消息不会丢失,您将再次阅读它. 然而 >您必须编写MessageListener来处理来自服务器的重复消息 其他选项和进一步阅读 如果您的JMS服务器不支持XA(全局)事务,那么这几乎是您唯一的解决方案. 如果JMS服务器支持XA事务但JDBC不支持,那么您可以使用JTATransactionManager并使用LastResourceCommitOptimisation.您可以使用像JOTM这样的开源JTATransactionManagers This JavaWorld article详细介绍了您的问题空间. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |