如何在Stomp和ActiveMQ(和Perl)中使用事务?
时间:2020-03-05 18:57:47 来源:igfitidea点击:
我正在尝试用ActiveMQ替换一些定制的消息队列,我需要从Perl与他们(很多)交谈。 ActiveMQ提供了一个Stomp接口,Perl提供了Net :: Stomp,所以看起来应该没问题,但事实并非如此。
即使我通过Stomp发送了BEGIN命令,使用SEND发送的消息也会立即发布,并且即使我中止交易,也不会发生任何事情。
我找不到任何明确的答案,表明不可能,不可能或者存在相关配置。另外,Stomp似乎不是检查服务器错误响应的好协议。
我不走运吗?
解决方案
回答
顺便说一句,问Perl / ActiveMQ / Stomp问题的最佳地点是ActiveMQ用户论坛,因为许多Perl-Stomp人士都在那里闲逛。
STOMP事务的窍门是确保我们发送的每条消息或者发出的每条确认都包括事务ID标头。请参阅STOMP协议的事务处理部分。
这样做的原因是,如果客户端是多线程的并且进行了一些非事务处理操作,那么使用STOMP可以同时进行许多事务。
回答
看看Net :: Stomp :: Receipt。它是Net :: Stomp的子类,可实现Stomp协议中的"退回收据",并允许我们确保正确接收消息,否则中止交易。
回答
我们必须将确认包装在事务中。
用伪代码(或者伪STOMP)可以是:
- 开始[TRANSACTION-ID]->发送到服务器
- MESSAGE MESSAGE-ID<-从服务器收到
- ACK [MESSAGE-ID] [TRANSACTION-ID]->发送到服务器
- COMMIT [TRANSACTION-ID]->发送到服务器
我已经使用PHP驱动程序进行了此工作(在传入框架对象进行确认时,修补中止调用以使用事务ID)。
不幸的是,在重新传递四个消息之后,客户端停止了。至少这发生在我身上。