【问题标题】:Update database and send JMS message in single transacion?更新数据库并在单个事务中发送 JMS 消息?
【发布时间】:2014-11-05 14:22:51
【问题描述】:

我使用 Spring 的 DataSourceTransactionManager 进行事务管理,使用 JmsTemplate 将消息发送到 ActiveMQ 队列。我的问题是强制在单事务下一个算法中工作:

Step 1: update DB;
Step 2: send message to queue;
Step 3: update DB;
Step 4: send message to queue.

据我了解 JmsTemplate 的文档,在我的情况下,我必须设置参数“sessionTransacted”=true: 将此标志设置为“true”将在托管事务之外运行时使用短的本地 JMS 事务,并在存在托管事务(XA 事务除外)的情况下使用同步的本地 JMS 事务。 后者具有与主事务(可能是本机 JDBC 事务)一起管理本地 JMS 事务的效果,JMS 事务在主事务之后提交。(c)

我的 jms 配置文件只包含这个:

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" ref="url"/>
        <property name="userName" ref="username"/>
        <property name="password" ref="password"/>
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="defaultDestinationName" value="SomeQueue"/>
        <property name="sessionTransacted" value="true"/>
</bean>

之后我尝试以简单的方式对其进行测试:

案例A:

@Transactional
public void sendMessageTransactionalErr(Object message, List<String> queueDestinationNames) throws Exception {
    sender.sendMessage(message, queueDestinationNames);
    throw new Exception("FatalException!");
}

案例 B:

@Transactional
public void sendMessageTransactionalOK(Object message, List<String> queueDestinationNames) throws Exception {
    sender.sendMessage(message, queueDestinationNames);
}

但在这两种情况下,请求执行消息都会发送到队列。即使 JDBC 事务回滚,JMS 事务提交也会成功。 我应该怎么做才能让它按我的需要工作?

【问题讨论】:

    标签: spring jdbc transactions jms


    【解决方案1】:

    您需要使用同时处理 JMS 事务和数据库事务的事务管理器。您的 JMS 事务与数据库事务是分开的。

    我记不清了,但是当我遇到这个问题时,我创建了一个org.springframework.jms.connection.JmsTransactionManager 的实例。创建一个 JTA 事务管理器并确保它知道这一点和数据库事务管理器。 使用@Transactional("jtaTransactionManager") 作为注释。对于这个用例,我可能已经尝试过 Bitronix 或 JOTM。

    Spring Integration and Transaction with JMS and DB

    参考:http://www.javaworld.com/article/2077963/open-source-tools/distributed-transactions-in-spring--with-and-without-xa.html?page=2

    【讨论】:

      猜你喜欢
      • 2018-09-07
      • 2013-07-10
      • 2020-02-16
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多