【发布时间】: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