4

私は永続的なキュー、非トランザクション、クライアント確認応答を持っています。消費者は jms.prefetchPolicy.queuePrefetch=1&wireFormat.maxInactivityDuration=50000 で読み取ります

そして、コンシューマがメッセージを処理すると、メッセージを確認します。

コンシューマーがメッセージを読み、ACK を送信する前にプロセスが突然終了した場合、ActiveMq で何が起こるでしょうか? (ここでどの ActiveMq パラメーターが関係しますか?)

これは、コンシューマがメッセージを処理するのに 10 分かかる場合 (つまり、コンシューマ タスクが有効で動作している場合) とどのように違うのでしょうか。(TCP/IP 接続を監視しますか?接続が切断された場合、メッセージが確認応答されないと想定しますか?)

メッセージが「ポイズン ピル」であるかどうか、つまりコンシューマーをクラッシュさせるかどうかを判断するにはどうすればよいですか? (コンシューマー タスクが終了しない場合、再配信カウントは有効であるように見えます。メッセージには、「正常に確認されずに n 回読み取られましたか?」という内部カウンターがありますか?)

実験として、6 つのメッセージを送信しました。そのうちの 1 つは「ポイズン ピル」(コンシューマーが ack を送信する前にコンシューマーを殺す) で、2 つの同時コンシューマーが実行されています (コンシューマーがカウントを 2 にするたびにコンシューマーを自動的に再起動します)。死ぬ)。キューを見ると (jconsole を使用し、broker.setUseJmx(true) を使用して jmx を有効にしています)、4 つのメッセージが配信され、2 つが処理中です。機内に 1 つではなく 2 つあるのはなぜですか?

ActiveMq と JMS の仕様をしばらくの間、明確で決定的な答えが得られずに読んでいました。そのため、どのパラメーターが関係しているか、既知のバグがあるかどうかについての洞察は非常に役立ちます。

4

1 に答える 1

4

これは純粋に私の JMS の理解に基づいています。完全に正しいとは限りません。

コンシューマーがメッセージを読み取り、ack を送信する前にプロセスが突然終了した場合、ActiveMq で何が起こるか

私の理解では、これは JMS プロバイダーとのセッションのコンテキストで発生するため、JMS プロバイダーは、セッションがアクティブでなくなったか失敗したかを認識しており、セッションの一部として確認されていないメッセージは、セッションが再配信されたときに再配信されます。設立。

メッセージが「ポイズン ピル」であるかどうか、つまりコンシューマーをクラッシュさせるかどうかを判断するにはどうすればよいですか?

あなたが言及したように、JMS プロバイダーは、おそらくメッセージのヘッダーでメッセージが再配信された回数を追跡します。

4 件のメッセージが配信され、2 件が処理中です

この点については不明

于 2012-06-29T01:40:37.107 に答える