0

現在、Websphere MQ に接続してメッセージを送受信するスタンドアロンの Java アプリに取り組んでいます。

フローは非同期モードであり、クラスを使用して実装しMessageListener、準備ができたときにキューからメッセージを取得します。リスナーでコンシューマを初期化するコードは次のとおりです。

if(connection == null)
        connection = getJmsConnection();

    try {
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        if (isTopic) {
            destination = session.createTopic(destinationName);
        } else {
            destination = session.createQueue(destinationName);
        }
        consumer = session.createConsumer(destination);
        consumer.setMessageListener(listener);
    } catch (JMSException e) {
        e.printStackTrace();
    }

このgetJmsConnection()メソッドは、Apache Commons Pool ライブラリを使用して実装されたプールから接続を返します。

私の質問は、プログラムが実行されている限り、プールからリスナーに割り当てられた接続がアクティブになり、そのリスナーに結び付けられるでしょうか? または、接続が断続的に使用され、他のプロセスで再利用できますか? 私たちの考えは、送信プロセスと受信プロセスでプールからの接続を再利用することですが、MessageListenerそれらが割り当てられている接続をどのように扱うかわかりません。

ありがとうございました。

4

1 に答える 1

1

ここで重要なオブジェクトは、接続ではなくセッションです。セッションは、ここでメッセージ消費 (非同期またはその他) を使用して主要な作業を行うセッション上にあります。

できるだけ広く接続を共有することをお勧めします。一時的な宛先は、接続レベルでスコープされます。そのため、プーリングを使用することをお勧めします。そのつながりを共有することは完全に可能です。

ただし、セッションをプールすることを検討する価値があるとも言えます。このコードを使用すると、そのコードを使用するたびに新しいセッションが作成されます。これは、WebSphere MQ キュー マネージャーへの新しい接続が作成されることを意味します。その範囲がどうなるかは明らかではありませんが、それがすぐに閉じられると、ボトルネックになる可能性があります。

于 2014-11-26T09:21:32.530 に答える