1

キューをリッスンする JMS リスナー アプリケーションを作成しています。TIBCO JMS 実装を使用していますが、断続的に複数のリスナー スレッドが同じメッセージを取得し、その結果、処理が重複するという問題に直面しています。

接続を作成する方法は次のとおりです。... ... ...

Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.PROVIDER_URL, url);
env.put(Context.INITIAL_CONTEXT_FACTORY, contextFactoryClass);
env.put(Context.SECURITY_PRINCIPAL, userName);

String decryptedPass = null;
//Decryption logic

try {
    // Look up queue connection factory from naming context.
    if (log.isEnabledFor(Level.DEBUG)) {
        log.debug("Attempting to lookup queue connection factory at '" + 
                    this.url + "' as user '" + userName + "'.");
    }

    Context ctx = new InitialContext(env);

    QueueConnectionFactory factory = 
        (QueueConnectionFactory) ctx.lookup(connectionFactoryName);

    // Create JMS connection using the factory we just looked up.
    if (log.isEnabledFor(Level.DEBUG)) {
        log.debug("Creating queue connection as user '" + userName + "'.");
    }
    connection = factory.createQueueConnection(userName, decryptedPass);
    ...
    ..
    .

次に、上で作成したものと同じ接続でリスナー スレッドを作成しています。

        //This is called in a loop.
                    // Create a JMS session that is non-transacted, but in client
        // acknowledge mode.  This will allow us to control when
        // messages are acknowledged.
        QueueSession session = 
            getQueueConnection().createQueueSession(
                false, Tibjms.EXPLICIT_CLIENT_ACKNOWLEDGE);

        // Create a receiver for the queue we are interested in.  Then
        // set the message listener defined on the outer class.  Messages
        // will be delivered on a dispatcher thread created by the
        // JMS provider.
        Queue queue = session.createQueue(getQueueName());
        session.createReceiver(queue).setMessageListener(getListener());
        ...
        ..
        .

ここで、5 つのリスナー スレッドが作成され、キューのレシーバーとしてリッスンすると仮定します。複数のリスナー スレッド/レシーバーが同じメッセージを受け取り、処理が重複するという動作が見られますか? JMS 構成でどのように処理できますか? それは可能ですか?または、プログラムによる解決策に頼る必要がありますか? どんなアドバイスでも大歓迎です。ありがとう。

4

2 に答える 2

2

メッセージがアプリケーションに配信されると、アプリケーションが確認するまで、そのメッセージはキューから隠されます (または他のコンシューマーは使用できません)。メッセージは、アプリケーションがそのメッセージを確認した後でのみ、キューから削除されます。コンシューマが確認せずに立ち去った場合、メッセージはキューに再表示されます。したがって、メッセージが非表示になると、そのメッセージは他のコンシューマーには表示されません。

ここで私が言おうとしているのは、メッセージが複数のコンシューマーに同時に渡されてはならないということです。リスナー コードを再確認することをお勧めします。

于 2012-06-27T04:58:49.800 に答える
0

Tibjms.EXPLICIT_CLIENT_ACKNOWLEDGE を javax.jms.Session.AUTO_ACKNOWLEDGE に変更してみてください

または、リスナーがメッセージの受信について確認していることを確認してください。

于 2012-06-26T07:58:04.230 に答える