2017-02-24 65 views
0

要求: 我们需要从JMS队列(由不同的应用程序发布)检索消息并将消息保存在我们的JMS队列中。需要整个流程是事务性的,以防万一消息不能保存在下游JMS队列中,那么从上游JMS队列接收的消息就不应该被确认。 我的配置是如下应该在从一个JMS队列持久化到另一个JMS队列时使用JmsTransactionManager

<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

您在这里肯定需要XA事务,因为您正在使用几个单独的事务资源。即使他们都是JMS,这并不意味着他们可以分享交易。

OTOH您可以尝试一种解决方案,如ChainedTransactionManager和第二个链接JmsTransactionManager s - 每个JMS资源一个。

更多的信息在Dave Syer的article

+0

这些组件正在使用相同的连接工厂。 –

+0

连接工厂不同。编辑过代码。所以相信会需要使用JmsTransactionManager – vjm

+0

不,如果您发现“ChainedTransactionManager”复杂,您需要'JtaTransactionManager'或任何其他XA实现。共享的单个'JmsTransactionManager'不适用于你的情况。 –

0

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

+0

连接工厂不同。编辑过代码。所以相信会需要使用JmsTransactionManager – vjm