JDBC 和 JMS 的弹簧事务同步
我有一个在jboss上运行的弹簧Web应用程序,它目前配置为使用HibernateTransactionManager进行db事务,使用JmsTransactionManager进行jms。对于jms,我们使用Camel和ActiveMQ,我们的数据库是DB2。在事务中,我需要将许多记录写入数据库并发送两个异步 jms 消息。jms消息是事件通知,我只希望在数据库事务提交时发送它们。
我愿意接受在jdbc事务已经提交后与代理通信失败的风险(因此没有发送任何消息,但数据库提交),所以我认为我不需要适当的XA。
我相信我需要的是使用弹簧事务同步的“尽力而为”的事务管理。
spring文档暗示了这样一个事实,即spring将同步两个事务,并在jdbc事务提交后才提交jms事务 - 但我认为它不是很清楚。这里的春季文档 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%29setSessionTransacted 上的 javadoc 听起来正是我想要的。
从我所看到的,我认为创建Camel JmsConfiguration,将transacted设置为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>
然而,我需要说服与我一起工作的人,他有点怀疑,并认为我的集成测试之所以有效,是因为记录不佳的副作用,而不是故意的弹簧功能。
所以我的问题是 - 我是否正确,弹簧可以依靠来同步交易,并始终在jdbc交易之后提交jms交易,或者这不是我应该依赖的东西,你能给我指出任何官方文档清楚地说明这一点吗?我想总的来说,这是一个好方法,还是我们应该以不同的方式管理这些交易?