Spring事务同步JDBC和JMS

21
我有一个在jboss上运行的spring web应用程序,目前配置为使用HibernateTransactionManager进行数据库事务管理并使用JmsTransactionManager进行Jms事务管理。对于Jms,我们使用Camel和ActiveMQ,我们的数据库是DB2。在事务内,我需要将一些记录写入数据库并发送两个异步Jms消息。这些Jms消息是事件通知,我只希望它们在数据库事务提交时才被发送。
我愿意承担与代理程序的通信风险,即在jdbc事务已经提交后(因此未发送任何消息但已提交数据库),但我认为我不需要适当的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,我也编写了一些集成测试来展示它。
从我看到的情况来看,我认为像这样使用设置为true的Camel JmsConfiguration是足够的:http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/jms/support/JmsAccessor.html#setSessionTransacted%28boolean%29 这里设置setSessionTransacted的javadoc听起来就是我想要的。
<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事务,或者这不是应该依赖的东西?您能否指向任何官方文件清楚地说明这一点?而且,总的来说,这是一个好的方法吗,还是我们应该以不同的方式管理这些事务?


你好,你现在有问题的答案了吗? - snowindy
嗨,不是特别清楚。我仍然没有看到任何真正清晰的文档,但我们现在正在生产中使用它,并且没有出现任何问题。 - laurie
3个回答

3

谢谢,我已经读了那篇文章好几遍了。在“尽力而为1PC”一节中,他们提供了两个Spring同步的例子,但其中一个配置了TransactionAwareConnectionFactoryProxy,另一个则是ChainedTransactionManager。如果我不需要进行任何额外的配置就能获得相同的结果,那我宁愿不这样做。 - laurie

1

您的 Git 存储库链接已失效。 - Derek Mahar

0

如果您正在使用本地事务,并且用例是将数据保存到数据库,然后发送到JMS

那么可能会有三种情况:

  1. 在接收到异常之后(在DB和JMS之前)

没有问题,一切都将回滚

  1. 保存到DB后,我们遇到了异常

如果有插入操作,则由于重试而在DB中存在多个行。每次重试都会进行插入。对于JMS,消息将进入DeadLetterQueue

  1. 保存到DB并发送到JMS后,我们遇到了异常

如果有插入操作,则由于重试而在DB中存在多个行。每次重试都会进行插入。对于JMS,消息将进入DeadLetterQueue

现在您不想使用XA,因此解决方案可能是

1)检查If(message.getJmsRedelivered() {…}

如果没有,则处理它

如果已经重新传递,请检查是否已经处理

根据消息中的详细信息检查数据是否在数据库中

请注意,重新传递很少发生,因此此检查也很少出现,并且没有额外开销

2)如果您的方法是幂等的,则不需要进行此检查

关于XA,XA保证仅传递一次消息并跨多个资源同步事务

但是使用XA会增加开销

因此,如果您可以在没有XA的情况下管理,则最好这样做


我不太理解你的第二点。我的理解是,如果在保存到数据库后出现异常,那么数据库将会回滚,同时JMS消息也会回滚。这样说对吗? - Vishal Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接