如何使用Stomp和ActiveMQ(和Per​​l)进行交易?

时间:2008-09-17 02:58:00

标签: perl activemq stomp

我正在尝试用ActiveMQ替换一些定制的消息队列,我需要从Perl中与他们(很多)交谈。 ActiveMQ提供了一个Stomp接口,Perl有Net :: Stomp,所以这看起来应该没问题,但事实并非如此。

即使我通过Stomp发送BEGIN命令,也会立即发布使用SEND发送的消息,如果我中止该事务,则不会发生任何事情。

我找不到任何明确的答案,建议说这是不可能的,这是可能的,或者说有相关的配置。此外,Stomp似乎不是检查来自服务器的错误响应的好协议。

我运气不好吗?

3 个答案:

答案 0 :(得分:3)

顺便说一下,问Perl / ActiveMQ / Stomp问题的最佳地点是ActiveMQ user forum,因为很多Perl-Stomp人都在那里。

STOMP事务的技巧是确保您发送的每条消息或您做出的每个确认都包含事务ID标头。请参阅transaction handling section of the STOMP protocol

原因在于,如果您的客户端是多线程的,那么使用STOMP可能会同时发生许多事务 - 以及一些非事务处理操作。

答案 1 :(得分:1)

看看Net::Stomp::Receipt。它是Net :: Stomp的子类,它通过Stomp协议实现“返回收据”,并允许您确保正确接收消息,否则中止交易。

答案 2 :(得分:1)

您必须将确认包装在交易中。

在伪代码(或伪STOMP)中,这将是:

  • BEGIN [TRANSACTION-ID] - >发送到服务器
  • MESSAGE [MESSAGE-ID](收到)< - 从服务器
  • 收到
  • ACK [MESSAGE-ID] [TRANSACTION-ID] - >发送到服务器
  • COMMIT [TRANSACTION-ID] - >发送到服务器

我已经使用了PHP驱动程序(当我传入一个帧对象来确认时修补中止调用以使用事务ID)。

不幸的是,在重新传送四条消息后,客户端停止了。至少这种情况发生在我身上。