【发布时间】:2012-03-03 00:40:30
【问题描述】:
我有一个在 jboss 上运行的 Spring Web 应用程序,当前配置为使用 HibernateTransactionManager 进行 db 事务,使用 JmsTransactionManager 进行 jms。对于 jms,我们使用 Camel 和 ActiveMQ,我们的数据库是 DB2。在一个事务中,我需要将一些记录写入数据库并发送两个异步 jms 消息。 jms 消息是事件通知,我只希望在数据库事务提交时发送它们。
我愿意承担在 jdbc 事务已经提交后与代理通信失败的风险(因此没有发送消息但已提交 db),所以我认为我不需要适当的 XA。
我相信我需要的是使用 Spring 事务同步的“尽力而为”的事务管理。
spring 文档暗示了这样一个事实,即 spring 将同步两个事务并仅在提交 jdbc 事务后提交 jms 事务 - 但我认为这不是很清楚。 http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#tx-resource-synchronization 此处的 spring 文档没有详细说明它是如何工作的。
我发现其他几个来源说 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 来同步事务并始终在 jdbc 事务之后提交 jms 事务,或者这不是我应该依赖的东西,你能指点我吗?说明清楚的文件?我想总的来说,这是一个很好的方法,还是我们应该以不同的方式管理这些交易?
【问题讨论】:
-
您好,您的问题现在有答案了吗?
-
嗨,不是真的。我还没有看到任何我想要的非常清晰的文档,但我们现在在生产中使用它没有任何问题。
标签: java spring transactions jms apache-camel