当前位置: 首页 > 知识库问答 >
问题:

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

司徒修能
2023-03-14

要求:我们需要从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个答案

桓宜
2023-03-14

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

益泰平
2023-03-14

这里肯定需要XA事务,因为您使用的是几个独立的事务资源。即使它们都是JMS,也不意味着它们可以共享事务。

o您可以尝试一种解决方案,比如ChainedTransactionManager和chain twojmtransactionmanagers,每个JMS资源对应一个。

更多信息请参阅Dave Syer的文章。

 类似资料:
  • 如果在发送接收到的消息时发生异常,则会丢失已接收到的消息。

  • JMS队列有2个消费者,同步和异步Java应用程序进程等待响应。1)同步应用程序发送请求,并根据JMS相关ID等待响应60秒。2)异步线程将不断侦听同一队列。

  • 问题内容: 我有一个带有HornetQ的JBoss-6服务器和一个队列: 有一个不同的消费者(在不同的机器)连接到这个队列中,但只有一个 单一的 消费者是活动的时间。如果我关闭此使用者,则消息将立即由其他使用者之一处理。 由于我的消息需要一些耗时的处理,因此我希望多个使用者同时处理其唯一消息。 我记得在早期版本的JBoss中也有类似的情况,该设置可以正常工作。在Jboss-6中,消息传递系统运行良

  • 我认为最初的作者认为这将创建一个持久的队列,但显然不是。我找不到这方面的好文档,想知道是否有人能证实/否认这一点。 提前谢了。

  • 我有一个由第三方发布的JMS队列。我想在不同的机器上设置多个使用者,只有一台特定机器的使用者确认该队列上的消息。简而言之,如果特定机器的使用者没有接收到消息,那么该消息不应从队列中删除。这是可以实现的吗?

  • 我主要在RPC模式下使用rabbitMq,但我还想将请求和响应消息复制到另一个队列。 最后,我想实现的是,外部消费者可以通过听一个队列来查看所有流量,我们称之为“日志队列”。 复制传入消息是可以的,我只需要使用扇出交换,或者使用与RPC调用使用的路由密钥相同的路由密钥将日志队列绑定到使用过的交换。 但我无法找到通过直接回复功能“扇出”发送的消息的方法。 到目前为止,我了解到响应消息以amqp的形式