我正在尝试用ActiveMQ替换一些定制的消息队列,我需要与他们(很多)从Perl交谈。 ActiveMQ提供了一个Stomp接口,而Perl有Net :: Stomp,所以这看起来应该没问题,但事实并非如此。
即使我通过Stomp发送BEGIN命令,也会立即发布使用SEND发送的消息,如果我中止该事务,则不会发生任何事情。
我找不到任何明确的答案,表明它是不可能的,这是可能的,或者说有相关的配置。 此外,Stomp似乎不是一个很好的协议来检查服务器的错误响应。
我运气不好吗?
BTW问题Perl / ActiveMQ / Stomp问题的最佳地点是ActiveMQ用户论坛,因为许多Perl-Stomp人都在那里。
STOMP事务的技巧是确保您发送的每条消息或您做出的每个确认都包含事务ID标头。 请参阅STOMP协议的事务处理部分 。
这样做的原因是,如果您的客户端是多线程的,那么使用STOMP可能会同时发生许多事务 - 以及一些非事务处理操作。
您必须将确认包装在事务中。
在伪代码(或伪STOMP)中,这将是:
我已经使用PHP驱动程序(在我传入一个帧对象来确认时修补中止调用以使用事务ID)。
不幸的是,在重新传送四条消息后,客户端停止了。 至少这件事发生在我身上。
看看Net :: Stomp :: Receipt 。 它是Net :: Stomp的子类,它从Stomp协议实现“返回收据”,并允许您确保正确接收消息,否则中止事务。