要求: 我们需要从JMS队列中检索消息(由不同的应用程序发布)并将消息保留在我们的JMS队列中。需要整个流程是事务性的,因此如果消息无法在下游JMS队列中保留,则不应确认从上游JMS队列接收的消息。 我的配置如下
<int-jms:message-driven-channel-adapter
id="MessageDrivenAdapter" channel=" jmsMessageChannel " destination="sourceDestination"
connectionFactory="CF1"
acknowledge="transacted"
/>
<int:channel id=" jmsMessageChannel " />
<int-jms:outbound-channel-adapter id="sendsomemsg"
channel=" jmsMessageChannel " destination=”finalDestination”
connectionFactory="CF2"
session-transacted="true" />
在这种情况下我是否需要使用JmsTransactionManager,或者应该在配置上方足够。我们可以处理重复的消息,因此我认为我们不需要XA事务。
答案 0 :(得分:2)
您肯定需要XA交易,因为您使用的是多个单独的交易资源。即使它们都是JMS,也不意味着它们可以共享交易。
OTOH您可以尝试像ChainedTransactionManager
这样的解决方案和链式两个JmsTransactionManager
s - 每个JMS资源一个。
更多信息在Dave Syer的article。
答案 1 :(得分:0)
只要您不转移到另一个线程(队列通道,任务执行程序),并且两个组件都使用相同的连接工厂,则出站操作将在与入站相同的事务中运行 - 基础出站适配器中的JmsTemplate
将使用侦听器容器传递消息的相同会话。