gpt4 book ai didi

spring - 在单个事务中更新数据库并发送 JMS 消息?

转载 作者:行者123 更新时间:2023-12-04 16:49:36 25 4
gpt4 key购买 nike

我使用 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 事务。 后者具有本地 JMS 事务与主事务(可能是 native JDBC 事务)一起管理的效果,JMS 事务在主事务之后立即提交。(c)

我的 jms-configuration 文件只包含这个:

<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 事务提交也会成功。我应该怎么做才能让它按我的需要工作?

最佳答案

您需要使用一个事务管理器来处理您的 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

关于spring - 在单个事务中更新数据库并发送 JMS 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25790777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com