从一个JMS队列持久化到另一个JMS队列时是否应该使用JmsTransactionManager

时间:2017-02-24 14:39:52

标签: spring-integration spring-jms

要求: 我们需要从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事务。

2 个答案:

答案 0 :(得分:2)

您肯定需要XA交易,因为您使用的是多个单独的交易资源。即使它们都是JMS,也不意味着它们可以共享交易。

OTOH您可以尝试像ChainedTransactionManager这样的解决方案和链式两个JmsTransactionManager s - 每个JMS资源一个。

更多信息在Dave Syer的article

答案 1 :(得分:0)

只要您不转移到另一个线程(队列通道,任务执行程序),并且两个组件都使用相同的连接工厂,则出站操作将在与入站相同的事务中运行 - 基础出站适配器中的JmsTemplate将使用侦听器容器传递消息的相同会话。