2

WebSphere MQを使用して、WebSphereを介してクラウド内のデータセンターにデータを送信するアプリケーションがあります。機能の一部は、サーバー側のサブスクライバーがメッセージが30分間受信されなかったことを検出すると、スレッドが5分間一時停止され、接続が切断されることです。再起動すると、再接続します。

実際には、切断してもサブスクリプションは削除されないことがわかりました。再接続しようとすると、次のエラーが表示されます。

「別のメッセージコンシューマーによって使用されているため、サブスクリプションの作成に問題が発生した可能性があります。同じ名前で新しいサブスクリプションを作成する前に、このサブスクリプションを使用しているメッセージコンシューマーが閉じていることを確認してください。詳細については、リンクされた例外を参照してください。 。」

これは、メッセージハンドラがまだ接続されていることを示しています。つまり、切断に失敗しました。XmsClientオブジェクトの切断コード(私の同僚の1人が変更した可能性がありますが、ライブラリの一部)は次のとおりです。

public override void Disconnect()
        {
            _producer.Close();
            _producer.Dispose();
            _producer = null;
            _consumer.MessageListener = null;
            _consumer.Close();
            _consumer.Dispose();
            _consumer = null;
            _sessionRead.Close();
            _sessionRead.Dispose();
            _sessionRead = null;
            _sessionWrite.Close();
            _sessionWrite.Dispose();
            _sessionWrite = null;
            _connection.Stop();
            _connection.Close();
            _connection.Dispose();
            _connection = null;

            //GC.Collect();



            IsConnected = false;
        }

なぜ接続がまだ存在するのかについて誰かが考えていますか?

4

1 に答える 1

2

エラーの説明から、サーバーサブスクライバーが永続的なサブスクリプションを作成しているように見えます。耐久性のあるサブスクリプションは、サブスクリプションアプリケーションが実行されていない場合でもメッセージを受信し続けます。永続サブスクリプションを削除するには、Session.Unsubscribe()を呼び出す必要があります。コンシューマーを閉じるだけでは、サブスクリプションは削除されません。

サブスクリプションを削除せずにサブスクライバーを閉じる場合は、最初にConnection.Stop()を発行し、次にメッセージリスナーの登録を解除してから、コンシューマーを閉じます。connection.Stopメソッドを呼び出すと、メッセージの配信が停止します。

于 2012-09-20T08:48:05.747 に答える