0

以下の素敵なコードを継承しました。

私がそれを読んだ方法では、開発者は 3 つの仮定を立てています。

  1. MQQueueManager インスタンスは、必ずしも isConnected() が true を返す状態で作成されるとは限りません
  2. 状態 isConnected() == false で作成された場合、状態は「後で」変更される可能性があるため、タイムアウト コード
  3. 切断された MQQueueManager からアクセス キューを作成しようとしても、例外はスローされません。

私が期待するのは、MQQueueManager インスタンスが状態 isConnected() == true で作成され、この状態が後で変更される可能性があり (ネットワーク障害など)、この状態変更 (isConnected() == false) によって操作が発生することです。キューは MQException で失敗します。

MQQueueManager を手動で切断した後にキューに再接続する唯一の方法は、MQQueueManager の新しいインスタンスを作成することであることに注意してください。

誰がここで私を正すことができますか?

qMgr = new MQQueueManager( qManager );

// Set up the options on the queue we wish to open...
// Note. All WebSphere MQ Options are prefixed with MQC in Java.
final int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;

// Now specify the queue that we wish to open,
// and the open options...
queue = qMgr.accessQueue( queueName, openOptions );

// Set the get message options...
final MQGetMessageOptions gmo = new MQGetMessageOptions(); // accept the
// defaults
gmo.options = MQC.MQGMO_WAIT;
gmo.waitInterval = 1000;


connectionStatus = CONNECTING;
int timeOutCounter = 0;
while(!qMgr.isConnected()) {
    InboundMsgTask.sleep(1000);
    timeOutCounter++;
    if(timeOutCounter > 4) {
        connectionStatus = TIME_OUT;
        return;
    }
}
connectionStatus = CONNECTED;
4

1 に答える 1

0

をチェックする代わりにIsConnected==True、実際の MQ .NET メソッド呼び出し (Get, Putなど) を実行することをお勧めします。接続が切断されている場合、これらの呼び出しは接続切断の実行をスローします ( MQRC 2009)。は MQ メソッドが呼び出さIsConnectedれる前である可能性がありますが、MQ メソッドの実行中に変更される可能性があることに注意してください。Trueコードで接続切断の例外を処理し、MQQueueManager.Disconnectメソッドを呼び出してから、接続を再確立する必要があります。このDisconnect呼び出しにより、割り当てられたすべてのリソースが解放され、開かれたすべてのキュー マネージャー オブジェクトが適切に閉じられます。メソッドによってスローされた例外を無視しますDisconnect

MQ v7.1 または v7.5 を使用している場合、.NET クライアントは、接続エラーを検出すると自動的にキュー マネージャーに再接続できます。自動再接続オプションを有効にする必要があります。MQ InfoCenter を参照してください。

編集:キュー マネージャーへの接続が正常に確立された場合、 Aはクラスnew MQQueueManager()のインスタンスを返します。MQQueueManagerエラーの場合、 aMQExceptionがスローされます。MQQueueManagerコンストラクターはブロッキング呼び出しであるため、接続が完了するのを待つ必要はありません。

于 2013-10-10T13:12:31.333 に答える