【问题标题】:Transaction management between 2 ActiveMQ instances?2个ActiveMQ实例之间的事务管理?
【发布时间】:2014-03-22 21:54:59
【问题描述】:

我有一个独立的应用程序(一个简单的命令行 jar),它已经可以从 ActiveMQ 队列读取或生成消息(无事务)。

我想添加能够从远程 ActiveMQ 队列读取消息并将其放入另一个远程 ActiveMQ 队列的功能。这 2 个 ActiveMQ 可能完全不同,也可能不一样,如果有任何连接问题,我还想确保在传输过程中不会丢失任何消息。

我一直在阅读大量关于事务的文章,据我所知,因为我在两个完全不同的 ActiveMQ 之间进行传输,所以一个简单的 Spring JmsTransactionManager 是不够的,而是需要某种分布式事务管理(比如XA 事务)。

我完全迷失在互联网上找到的关于几个不同库等的代码示例的海洋中。

谁能告诉我找到解决这个问题的最简单方法的方法?我应该以某种方式在 Spring 之上使用 JTA(在非 j2ee 应用程序服务器环境中使用 JTA 是否可行)?我已经在使用 spring 的 jmstemplate 来发送/接收消息,所以如果我可以继续使用 spring(最好没有 xml 上下文配置,因为我今天以编程方式进行所有操作)。

【问题讨论】:

    标签: transactions jms activemq spring-jms xa


    【解决方案1】:

    如果您不需要对第二个远程 ActiveMQ 的写入与读取在同一事务范围内,那么您可以在没有分布式事务的情况下执行此操作。您可以保持打开读取事务,直到您成功写入第二个远程 ActiveMQ。一旦成功,您就可以提交读取事务。然而,这意味着,如果在发送之后但在读取提交之前发生故障,您最终将重新发送消息。因此,这假设重复发送是可以的。如果你不能容忍在失败的情况下重复发送,你必须有分布式事务。

    【讨论】:

    • 谢谢。我有同样的想法,但没有意识到重复的场景。老实说,如果可能的话,我想避免重复,目前性能并不是真正的问题,所以我正在考虑继续使用分布式事务。在这种情况下,我最好使用一些 3PP JTA 实现,例如 Atomikos,对吗?同样在同一个远程 ActiveMQ 中的 2 个队列之间简单地移动消息的场景中,spring 的 JmsTransactionManager 是否就足够了,还是仅适用于嵌入式实例?
    • 有关上述分布式(XA)事务实现的更多详细信息,请参见stackoverflow.com/questions/22072100/…
    猜你喜欢
    • 2014-03-31
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    相关资源
    最近更新 更多