10

いくつかの特注のメッセージキューをActiveMQに置き換えようとしていますが、Perlから(多くの場合)それらと通信する必要があります。ActiveMQはStompインターフェースを提供し、PerlはNet :: Stompを備えているため、これは問題ないように見えますが、そうではありません。

Stompを介してBEGINコマンドを送信しても、SENDで送信されたメッセージはすぐに公開され、トランザクションを中止しても何も起こりません。

それが不可能であること、可能であること、または関連する構成が少しあることを示唆する明確な答えを見つけることができません。また、Stompは、サーバーからのエラー応答をチェックするための優れたプロトコルではないようです。

私は運が悪いですか?

4

3 に答える 3

3

ところで、Perl/ActiveMQ/Stomp に関する質問をするのに最適な場所は、多くの Perl-Stomp 関係者がたむろしているActiveMQ ユーザー フォーラムです。

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] (受信) ← サーバーから受信
  • ACK [MESSAGE-ID] [TRANSACTION-ID] -> サーバーに送信
  • COMMIT [TRANSACTION-ID] -> サーバーに送信

私はすでにこれをPHPドライバーで動作させています(フレームオブジェクトを渡して承認するときにトランザクションIDを使用するように中止呼び出しにパッチを当てています)。

残念ながら、4 つのメッセージを再配信した後、クライアントは停止します。少なくともこれは私に起こります。

于 2009-03-03T17:53:33.067 に答える