我正在尝试使用ActiveMQ替换一些定制的消息队列,并且需要使用Perl从中频繁地发送和接收消息。ActiveMQ提供了一个Stomp接口,而Perl则有Net::Stomp,看起来这应该是可行的,但实际上不是这样。
即使我发送一个BEGIN
帧到Stomp,使用SEND
发送的消息也会立即发布,如果我调用ABORT
撤销事务,则什么也不会发生。
我找不到任何明确的答案表明它是否可能、是否不可能或是否存在相关配置。此外,Stomp似乎不是检查服务器错误响应的好协议。
我该怎么办?
顺便提一下,询问Perl/ActiveMQ/Stomp问题的最佳场所是ActiveMQ用户论坛,因为许多Perl-Stomp爱好者都在那里闲逛。
处理STOMP事务的关键是确保您发送的每条消息或做出的每个确认都包括事务ID头。请参阅STOMP协议的事务处理部分。
原因是,如果您的客户端是多线程的,使用STOMP可能会同时进行许多事务以及一些非事务性操作。
您必须将确认包装在事务中。
伪代码(或伪STOMP)如下:
我已经使用PHP驱动程序使其工作正常(修补了中止调用,以便在传递帧对象以确认时使用事务ID)。
不幸的是,在重新传递四条消息后,客户端停止。至少这是我的情况。