如何在Stomp和ActiveMQ(和Perl)中使用事务?

如何在Stomp和ActiveMQ(和Perl)中使用事务?

How do I use transactions with Stomp and ActiveMQ (and Perl)?

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

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

我找不到任何明确的答案,表明不可能,不可能或存在相关的配置。 而且,Stomp似乎不是检查服务器错误响应的好协议。

我不走运吗?


顺便说一句,问Perl / ActiveMQ / Stomp问题的最佳地点是ActiveMQ用户论坛,因为许多Perl-Stomp人士都在那里闲逛。

STOMP事务的技巧是确保您发送的每条消息或发出的每条确认都包括事务ID头。请参阅STOMP协议的事务处理部分。

原因是,如果您的客户端是多线程的,那么使用STOMP可以同时进行许多事务-以及一些未处理的操作。


您必须将确认包装在事务中。

用伪代码(或伪STOMP)可以是:

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

我已经使用PHP驱动程序进行了此工作(在传入框架对象进行确认时,修补中止调用以使用事务ID)。

不幸的是,在重新传递四个消息之后,客户端停止了。至少这发生在我身上。


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


推荐阅读