如何使用Stomp和ActiveMQ(以及Perl)的事务?

如何使用Stomp和ActiveMQ(以及Perl)的事务?,perl,activemq,stomp,Perl,Activemq,Stomp,我正试图用ActiveMQ替换一些定制的消息队列,我需要从Perl中与它们(很多)交谈。ActiveMQ提供了一个Stomp接口,Perl有Net::Stomp,所以这看起来应该是好的,但事实并非如此 即使我通过Stomp发送BEGIN命令,使用send发送的消息也会立即发布,如果我中止事务,则不会发生任何事情 我找不到任何明确的答案表明这是不可能的,这是可能的,或者存在相关的配置。此外,Stomp似乎不是检查服务器错误响应的好协议 我运气不好吗?顺便说一句,问Perl/ActiveMQ/Sto

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

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

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


我运气不好吗?

顺便说一句,问Perl/ActiveMQ/Stomp问题的最好地方是那里,因为那里有很多Perl Stomp人

STOMP事务的诀窍是确保您发送的每一条消息或做出的每一个确认都包含事务ID头。看


原因是,如果您的客户机是多线程的,那么使用STOMP,您可以同时进行多个事务,以及一些非事务操作。

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

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

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

  • 开始[TRANSACTION-ID]->发送到服务器
  • 消息[消息ID](已接收)发送到服务器
  • 提交[TRANSACTION-ID]->发送到服务器
我已经通过PHP驱动程序实现了这一点(当我传入帧对象进行确认时,修补中止调用以使用事务ID)


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

是的,我正在遵循Stomp协议规则并发送一个事务头。(我希望我能让tcpflow在这台机器上工作;tcpdump看跺脚很糟糕。)我也会试试那个论坛,谢谢!如果说,我有一个while循环,那么伪代码会在循环中吗?或者BEGIN和ABORT是否在外部?它们将在循环内部,因为您需要为发送和接收的每条消息打开一个事务。事务id是否每次都设置为不同的值?使用COMMIT而不是ABORT更改所有内容。它不会标记错误并对消息重新排队,而是会将其删除。必须包括事务标识符,对于每个打开的事务必须是唯一的,并且必须由客户端或消费者生成。