4

メッセージ確認応答を確実にする方法は、jmsブローカーで確認応答が呼び出されたメッセージまでのメッセージのみを削除します。現在、jmsキューから消費し、部分的に処理するシステムがあります。しばらくすると、これらのメッセージのバッチが別のスレッドによって永続化されます。今メッセージを確認する必要があります。しかし、問題は、メッセージの消費を停止する必要があることです。そうしないと、以前に受信したメッセージを確認すると、後続のすべてのメッセージも確認されます。

つまり、キューに10個のメッセージがあるとします。私はそれらのうちの7つを消費し、次に5番目のメッセージで確認します。これにより、コンシューマーが受信した7つのメッセージすべてがキューから削除されます.5番目のメッセージまでメッセージを確認してキューから削除する方法はありますか?

編集:2つのセッションを作成し、異なるセッションから消費しようとしましたが、(少なくともapache qpidを使用して)これは一貫性のないパフォーマンスを示します。一貫性がないということは、テスト中に、どれだけ待っても、一方のコンシューマーがメッセージを受信でき、もう一方のコンシューマーがまったく受信しない場合があるということです。これは私にとっては解決策としてはうまくいきましたが、一貫性がないため、これを解決策として使用することはできません。

4

2 に答える 2

5

この投稿が古いことは理解していますが、この回答は後で見つけた人に役立つはずです。

確認したいメッセージをきめ細かく制御したい場合は、individualacknowledge メソッドが役に立ちます。この確認モードを使用すると、セッション内の個々のメッセージを確認できます。確認応答されていないメッセージは再配信されます。

これは仕様の一部ではありませんが、ほとんどのキュー プロバイダーは仕様外でサポートしています。

オラクル

柔軟性を高めるために、Message Queue では JMS クライアント確認モードをカスタマイズできます。クライアント確認モードでは、クライアントはメッセージ オブジェクトのacknowledge()メソッドを呼び出して、メッセージの消費を明示的に確認します。

このメソッドの標準的な動作は、メソッドが最後に呼び出されてからセッション内の任意のコンシューマーによって消費されたすべてのメッセージをセッションに確認させることです。(つまり、セッションは、誰が消費したかに関係なく、現在のメッセージと以前に未確認のすべてのメッセージを確認します。)

JMS によって指定された標準の動作に加えて、Message Queue ではクライアント確認モードを使用して一度に 1 つのメッセージを確認できます。

public interface com.sun.messaging.jms.Message {
          void acknowledgeThisMessage() throws JMSException;
          void acknowledgeUpThroughThisMessage() throws JMSException;
}

アクティブMQ

他の有用な確認モードも想像できます。たとえば、Message.acknowledge() が特定の MessageConsumer で受信したメッセージのみを確認する CONSUMER_ACKNOWLEDGE や、Message.acknowledge() が受信したメッセージのみを確認する CONSUMER_CHECKPOINT_ACKNOWLEDGE などがあります。メソッドが呼び出された Message インスタンス。

しかし、これらのさまざまな可能性すべてに着手することなく、INDIVIDUAL_ACKNOWLEDGE モードを追加することだけを検討することは可能でしょうか? これだけでも、マルチスレッド アプリケーションが必要な動作を実現できるようになります。

connection.createQueueSession(false, ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE);

私は QPID を個人的に使用したことはありませんが、ドキュメントには、個々のメッセージ ack が可能であるという事実が示唆されています。

Examples
  # acknowledge all received messages
  session.acknowledge

  # acknowledge a single message
  session.acknowledge :message => message

バッチの処理中に、受信および処理された各メッセージを確認できます。例外が発生した場合は、メッセージを確認しないでください。

于 2014-02-21T12:21:34.123 に答える
1

メッセージを確認すると、キュー マネージャーはそのメッセージと、そのメッセージの前に受信した他のすべてのメッセージを削除します。アプリケーションがまだ受信していないメッセージを削除するべきではありません。メッセージを確認する方法についてアプリケーションを確認することをお勧めします。

于 2011-12-08T06:39:55.963 に答える