この投稿が古いことは理解していますが、この回答は後で見つけた人に役立つはずです。
確認したいメッセージをきめ細かく制御したい場合は、individual
acknowledge メソッドが役に立ちます。この確認モードを使用すると、セッション内の個々のメッセージを確認できます。確認応答されていないメッセージは再配信されます。
これは仕様の一部ではありませんが、ほとんどのキュー プロバイダーは仕様外でサポートしています。
柔軟性を高めるために、Message Queue では JMS クライアント確認モードをカスタマイズできます。クライアント確認モードでは、クライアントはメッセージ オブジェクトのacknowledge()メソッドを呼び出して、メッセージの消費を明示的に確認します。
このメソッドの標準的な動作は、メソッドが最後に呼び出されてからセッション内の任意のコンシューマーによって消費されたすべてのメッセージをセッションに確認させることです。(つまり、セッションは、誰が消費したかに関係なく、現在のメッセージと以前に未確認のすべてのメッセージを確認します。)
JMS によって指定された標準の動作に加えて、Message Queue ではクライアント確認モードを使用して一度に 1 つのメッセージを確認できます。
public interface com.sun.messaging.jms.Message {
void acknowledgeThisMessage() throws JMSException;
void acknowledgeUpThroughThisMessage() throws JMSException;
}
他の有用な確認モードも想像できます。たとえば、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
バッチの処理中に、受信および処理された各メッセージを確認できます。例外が発生した場合は、メッセージを確認しないでください。