2008-09-17 71 views
10

我試圖用ActiveMQ替換一些定製的消息隊列,並且我需要從Perl中與他們(很多)交談。 ActiveMQ提供了一個Stomp接口,Perl有Net :: Stomp,所以這看起來應該沒問題,但事實並非如此。如何使用Stomp和ActiveMQ(和Per​​l)進行交易?

即使我通過Stomp發送BEGIN命令,使用SEND發送的消息也立即發佈,如果我中止事務,則不會發生任何事情。

我找不到任何明確的答案,暗示它不可能,這是可能的,或者有一點相關的配置。另外,Stomp似乎不太適合檢查服務器的錯誤響應。

我運氣不好嗎?

回答

3

順便說一句Perl/ActiveMQ/Stomp問題的最佳地方是ActiveMQ user forum,因爲許多Perl-Stomp人都在那裏閒逛。

STOMP交易的訣竅在於確保您發送的每封郵件或您做出的每個確認都包含交易ID標頭。請參閱transaction handling section of the STOMP protocol

原因是,如果您的客戶端是多線程的,那麼使用STOMP,您可以同時進行多筆交易 - 以及一些非交易操作。

+0

是的,我遵循Stomp協議規則併發送事務頭。 (我希望我可以在這臺機器上運行tcpflow; tcpdump很糟糕)。我也會試試這個論壇,謝謝! – rjbs 2008-09-17 11:32:05

1

看看Net::Stomp::Receipt。它是Net :: Stomp的一個子類,它實現了Stomp協議中的「返回收據」,並允許您確保正確接收您的消息,並以其他方式中止交易。

1

您必須在交易中包裝確認。

在僞代碼(或僞STOMP),這將是:

  • BEGIN [TRANSACTION-ID] - >發送到服務器
  • MESSAGE [MESSAGE-ID](收到)< - 從服務器
  • 接收
  • ACK [MESSAGE-ID] [TRANSACTION-ID] - >發送到服務器
  • COMMIT [TRANSACTION-ID] - >發送到服務器

我已經得到了這個與PHP驅動程序的工作(當我傳入幀對象來確認時,修補中止調用以使用事務ID)。

不幸的是,在重新傳送四條消息之後,客戶端停止。至少這發生在我身上。

+0

如果說,我有一個while循環,那個僞代碼會在循環中嗎?或者BEGIN和ABORT會在外面? – obsessiveCookie 2014-04-20 02:38:18