如何使用Stomp和ActiveMQ(以及Perl)进行事务处理?

jhkqcmku  于 2022-12-13  发布在  Perl
关注(0)|答案(3)|浏览(179)

我试图用ActiveMQ替换一些定制的消息队列,我需要从Perl与它们(很多)对话。ActiveMQ提供了一个Stomp接口,Perl有Net::Stomp,所以这看起来应该没问题,但事实并非如此。
即使我通过Stomp发送BEGIN帧,使用SEND发送的消息也会立即发布,而如果我发送ABORT,则事务不会发生任何事情。
我找不到任何明确的答案来表明这是不可能的,这是可能的,或者有一点相关的配置。而且,Stomp似乎不是一个很好的协议来检查来自服务器的错误响应。
我运气不好吗?

axr492tv

axr492tv1#

顺便说一句,问Perl/ActiveMQ/Stomp问题的最好地方是ActiveMQ user forum,因为有很多Perl Stomp的人在那里闲逛。
STOMP事务的诀窍是确保发送的每条消息或做出的每个确认都包含事务ID头。
这样做的原因是,如果您的客户端是多线程的,那么使用STOMP,您可以同时执行多个事务,沿着一些非事务操作。

w3nuxt5m

w3nuxt5m2#

看一下Net::Stomp::Receipt,它是Net::Stomp的一个子类,实现了Stomp协议的“返回收据”,并允许您确保消息的正确接收,否则中止事务。

lmyy7pcs

lmyy7pcs3#

您必须将确认 Package 在事务内。
在伪代码(或伪STOMP)中,这将是:

  • 开始[事务ID] -〉发送到服务器
  • MESSAGE [MESSAGE-ID](已接收)〈-从服务器接收
  • ACK [消息ID] [事务ID] -〉发送到服务器
  • COMMIT [事务ID] -〉发送到服务器

我已经在PHP驱动程序中实现了这一点(在传入帧对象进行确认时,修补中止调用以使用事务ID)。
不幸的是,在重新发送了四条消息后,客户端停止了。至少在我身上发生了这种情况。

相关问题