JDBC和JMS的Spring事务同步

lau*_*rie 16 java spring transactions jms apache-camel

我有一个在jboss上运行的spring web app,当前配置为使用HibernateTransactionManager进行db事务,JmsTransactionManager用于jms.对于jms,我们使用Camel和ActiveMQ,我们的数据库是DB2.在一个事务中,我需要将大量记录写入数据库并发送两个异步jms消息.jms消息是事件通知,我只希望在数据库事务提交时发送它们.

我愿意接受在jdbc事务已经提交之后与代理通信失败的风险(因此没有发送消息但是db已经提交)所以我认为我不需要正确的XA.

我相信我需要的是使用spring transaction同步的"尽力而为"的事务管理.

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>
Run Code Online (Sandbox Code Playgroud)

然而,我需要说服我工作的人有点怀疑,并认为我的集成测试只能起作用,因为副作用很少,而不是有意的弹簧特征.

所以我的问题是 - 我是否正确可以依赖Spring来同步事务并始终在jdbc事务之后提交jms事务,或者这不是我应该依赖的东西,你能否指出我所说的任何官方文档那清楚吗?我想一般来说这是一个很好的方法,或者我们应该以不同的方式管理这些交易?

gka*_*mal 3

这篇文章可能会对Spring 中的分布式事务(带或不带 XA )有所帮助。我不认为它专门涵盖您的情况 - 发送消息+更新数据库。