如何将事务与 Stomp 和 ActiveMQ(和 Perl)一起使用?
Posted
技术标签:
【中文标题】如何将事务与 Stomp 和 ActiveMQ(和 Perl)一起使用?【英文标题】:How do I use transactions with Stomp and ActiveMQ (and Perl)? 【发布时间】:2010-09-09 22:02:46 【问题描述】:我正在尝试用 ActiveMQ 替换一些定制的消息队列,我需要通过 Perl 与他们(很多)交谈。 ActiveMQ 提供了一个 Stomp 接口,而 Perl 有 Net::Stomp,所以这看起来应该没问题,但事实并非如此。
即使我通过 Stomp 发送 BEGIN 命令,使用 SEND 发送的消息也会立即发布,如果我 ABORT 事务,则不会发生任何事情。
我找不到任何明确的答案表明它不可能,这是可能的,或者有一些相关的配置。此外,Stomp 似乎不是检查服务器错误响应的好协议。
我运气不好?
【问题讨论】:
【参考方案1】:您必须将确认包装在事务中。
在伪代码(或伪 STOMP)中,这将是:
BEGIN [TRANSACTION-ID] -> 发送到服务器 MESSAGE [MESSAGE-ID](已接收) ACK [MESSAGE-ID] [TRANSACTION-ID] -> 发送到服务器 COMMIT [TRANSACTION-ID] -> 发送到服务器我已经使用 php 驱动程序进行了这项工作(当我传入一个框架对象进行确认时,修补中止调用以使用事务 ID)。
不幸的是,在重新发送四条消息后,客户端停止了。至少这发生在我身上。
【讨论】:
如果说,我有一个while循环,那伪代码会在循环中吗?或者 BEGIN 和 ABORT 会在外面吗? 它们将在循环中,因为您需要为发送和接收的每条消息打开一个事务。 是否每次都将 transaction-id 设置为不同的值? 使用 COMMIT 而不是 ABORT 会改变一切。它不会标记错误并将消息重新排队,而是将其删除。 交易标识符必须包含在内,对于每个打开的交易必须是唯一的,并且必须由客户端或消费者生成。【参考方案2】:看看Net::Stomp::Receipt。它是 Net::Stomp 的子类,它实现了 Stomp 协议的“回执”,并允许您确保正确接收您的消息,否则中止交易。
【讨论】:
【参考方案3】:顺便说一句,问 Perl/ActiveMQ/Stomp 问题的最佳地点是ActiveMQ user forum,因为那里有很多 Perl-Stomp 人。
STOMP 交易的诀窍是确保您发送的每条消息或做出的每条确认都包含交易 ID 标头。请参阅transaction handling section of the STOMP protocol。
这样做的原因是,如果您的客户端是多线程的,那么使用 STOMP 您可以同时进行许多事务 - 以及一些非事务操作。
【讨论】:
是的,我遵循 Stomp 协议规则并发送交易标头。 (我希望我能让 tcpflow 在这台机器上工作;tcpdump 看 stomp 很烂。)我也会试试那个论坛,谢谢!以上是关于如何将事务与 Stomp 和 ActiveMQ(和 Perl)一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
使用 ruby 和 stomp 将消息写入 ActiveMQ
如何在 ActiveMQ 中通过 Stomp/JSON 使用 JMS 消息转换