10

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

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

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

我运气不好?

4

3 回答 3

3

顺便说一句,问 Perl/ActiveMQ/Stomp 问题的最佳地点是ActiveMQ 用户论坛,因为那里有很多 Perl-Stomp 人。

STOMP 交易的诀窍是确保您发送的每条消息或您做出的每条确认都包含交易 ID 标头。请参阅STOMP 协议的事务处理部分

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

于 2008-09-17T08:07:52.977 回答
1

看看Net::Stomp::Receipt。它是 Net::Stomp 的子类,它实现了 Stomp 协议的“回执”,并允许您确保正确接收您的消息,否则中止交易。

于 2008-09-18T15:32:15.910 回答
1

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

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

  • BEGIN [TRANSACTION-ID] -> 发送到服务器
  • MESSAGE [MESSAGE-ID] (received) <- 从服务器接收
  • ACK [MESSAGE-ID] [TRANSACTION-ID] -> 发送到服务器
  • COMMIT [TRANSACTION-ID] -> 发送到服务器

我已经使用 PHP 驱动程序进行了这项工作(当我传入一个框架对象进行确认时,修补中止调用以使用事务 ID)。

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

于 2009-03-03T17:53:33.067 回答