从一个 JMS 队列持久化到另一个 JMS 队列时是否应该使用 JmsTransactionManager
Should JmsTransactionManager be used when persisting from one JMS Queue to another JMS Queue
要求:
我们需要从 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 事务,因为您正在使用多个单独的事务资源。即使它们都是 JMS,也不意味着它们可以共享事务。
OTOH 你可以尝试像 ChainedTransactionManager
这样的解决方案并链接两个 JmsTransactionManager
s - 每个 JMS 资源一个。
更多信息在 Dave Syer 的 article 中。
只要您不切换到另一个线程(队列通道、任务执行器),并且两个组件都使用相同的连接工厂,出站操作将 运行 在与入站 - 出站适配器中的底层 JmsTemplate
将使用侦听器容器传递消息的同一会话。
要求: 我们需要从 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 事务,因为您正在使用多个单独的事务资源。即使它们都是 JMS,也不意味着它们可以共享事务。
OTOH 你可以尝试像 ChainedTransactionManager
这样的解决方案并链接两个 JmsTransactionManager
s - 每个 JMS 资源一个。
更多信息在 Dave Syer 的 article 中。
只要您不切换到另一个线程(队列通道、任务执行器),并且两个组件都使用相同的连接工厂,出站操作将 运行 在与入站 - 出站适配器中的底层 JmsTemplate
将使用侦听器容器传递消息的同一会话。