0

AcitveMQ 5.3 を使用しています。クライアントが (MessageProducer の) send メソッドでハングした理由がわかりません。

これが私の状況です。サーバー (MQ ブローカーを使用) があり、サーバーを 1.0 から 2.0 にアップグレードしました (MQ ブローカーも 5.3 から 5.6 にアップグレードされました)。同時に、MQ ブローカが再起動されたため、クライアントは「中断」通知と「再開」通知を受け取りました。「再開」で、クライアントのステータスをサーバーに送信したところ、ハングしました。

私には10人のクライアントがいて、そのうちの2人は上記の状況にあります。ブローカーにメッセージを送信している間に MQ ブローカーを再起動しようとしました (上記と同様のシナリオです)。ただし、再現するのは困難です。

誰もこのような経験をしたことがありますか?MessageProducer メソッドの send でぶら下がっていますか?

ありがとう。


更新:手順は次のとおりです。

  1. ブローカーとクライアントのバージョンは 5.3 です

  2. ブローカーをアンインストールし、5.6 ブローカーをインストールします。

    ==> おっしゃる通り、ブローカーとクライアントのバージョンが一致していません。バージョンが一致しないと問題が発生しますか? しかし、下位互換性があるはずですよね?

  3. TransportListener の Interrupted メソッドと Resume メソッドを取得します

  4. いくつかの接続回復タスクを実行し、Resume 呼び出しでメッセージをブローカーに送信します

    ==> おっしゃる通り、レジュームコールでメッセージを送るのは危険です。ただし、これは常に行っており、以前はこの種の問題はありませんでした.

  5. 私のプログラムは MessageProducer send でハングします。

それはより明確ですか?コードはあちこちで区切られており、投稿するのは簡単ではありません。

ありがとう。


更新part2、

MessageProducer の送信を別のスレッドに移動しますが、送信が完了するまで TransportListener の Resume コールバックで待機します。このシナリオでは、メッセージの送信時に常にハングします。ただし、「Resume コールバックで直接メッセージを送信する」がハングする場合があります。これら 2 つのシナリオは非常に似ています。なぜそんなに違うのですか?ソース コード (ActiveMQ-Cpp 3.4.5) を掘り下げましたが、特別なことは見つかりませんでした。または間違ったファイルを掘り下げましたか?その仕組みが知りたいです。

ところで、「更新パート 2」の前に、私は Java バージョンの MQ を使用しています。しかし、結果はJavaとcppの間に違いはないようです。というわけで、「アップデートpart2」では、ライブラリとしてActiveMQ-CPP 3.4.5を使用しています。

ありがとう。

4

1 に答える 1