我有一个在 jboss 上运行的 Spring Web 应用程序,当前配置为使用 HibernateTransactionManager 进行 db 事务,使用 JmsTransactionManager 进行 jms。对于 jms,我们使用 Camel 和 ActiveMQ,我们的数据库是 DB2。在一个事务中,我需要将一些记录写入数据库并发送两条异步 jms 消息。 jms 消息是事件通知,我只希望在数据库事务提交时发送它们。
我愿意接受在 jdbc 事务已经提交后与代理通信失败的风险(因此没有发送消息但已提交 db)所以我认为我不需要适当的 XA。
我相信我需要的是使用 Spring 事务同步的“尽力而为”的事务管理。
spring 文档暗示了这样一个事实,即 spring 将同步两个事务并仅在提交 jdbc 事务后提交 jms 事务 - 但我认为这不是很清楚。这里的 Spring 文档 http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#tx-resource-synchronization没有详细说明它的工作原理。
我发现其他几个来源说 spring 会做我想做的事情,包括下面的一些 javadoc,我已经编写了一些也显示它的集成测试。
http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/jms/support/JmsAccessor.html#setSessionTransacted%28boolean%29这里 setSessionTransacted 上的 javadoc 听起来正是我想要的。
据我所见,我认为像这样创建 Camel JmsConfiguration 并将事务设置为 true 就足够了:
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="pooledConnectionFactory"/>
<property name="transacted" value="true"/>
<property name="concurrentConsumers" value="10"/>
</bean>
但是,我需要说服与我一起工作的人,他有点怀疑并认为我的集成测试仅因为记录不充分的副作用而不是故意的 Spring 功能才有效。
所以我的问题是 - 我是否正确,可以依靠 spring 来同步事务并始终在 jdbc 事务之后提交 jms 事务,或者这不是我应该依赖的东西,你能指点我吗?说明清楚的文件?我想总的来说,这是一个很好的方法,还是我们应该以不同的方式管理这些交易?
最佳答案
这篇文章可能会有所帮助Distributed transactions in Spring, with and without XA .我不认为它专门涵盖您的情况 - 发送消息 + 更新数据库。
关于java - JDBC和JMS的Spring事务同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9229573/