从一个JMS队列到另一个JMS队列时,是否应该使用JMSTRANSACTIONMANAGER



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

您绝对需要XA事务,因为您使用了几个单独的交易资源。即使他们俩都是JM,也不意味着他们可以共享交易。

OTOH您可以尝试使用ChainedTransactionManager和链条两个JmsTransactionManager S的解决方案 - 每个JMS资源。

更多信息在戴夫·赛尔(Dave Syer)的文章中。

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

最新更新