2

MQQueueManagerの新しいオブジェクトを作成しているときに例外(理由コード2059 -MQRC_Q_MGR_NOT_AVAILABLE)がスローされるため、しばらくするとMQQueueManagerに再接続できません。クライアントアプリは.NET/C#で記述されており、Win2003で実行しています。

ただし、クライアントアプリを再起動した後、QMに接続できます。これは、QMライブラリの一部の状態が正しくないことを示していますか?QMに再接続できるように、コードの状態をリセットするにはどうすればよいですか?クライアントアプリコードからQMへのすべてのアクティブなTCP接続をリセット/切断する方法はありますか?

私の接続コード:

    ハッシュテーブルのプロパティ=newHashtable();
    properties.Add(MQC.HOST_NAME_PROPERTY、Host);
    properties.Add(MQC.PORT_PROPERTY、Port);
    property.Add(MQC.USER_ID_PROPERTY、UserId);
    property.Add(MQC.PASSWORD_PROPERTY、Password);
    properties.Add(MQC.CHANNEL_PROPERTY、ChannelName);
    properties.Add(MQC.TRANSPORT_PROPERTY、TransportType);
    //次の行はランダムに例外をスローします
    MQQueueManager queueManager = new MQQueueManager(qmName、properties);

スタックトレース:

    ソース:amqmdnet
    CompletionCode:2
    ReasonCode:2059
    理由:2059
    スタックトレース:
     IBM.WMQ.MQBase.throwNewMQException()で
     IBM.WMQ.MQQueueManager.Connect(String queueManagerName)で
     IBM.WMQ.MQQueueManager..ctor(String qmName、Hashtableプロパティ)で
     WebSphereMQOutboundAdapter.WebSphereMQOutbound.ConnectToWebSphereMQ()で
4

2 に答える 2

2

接続はスレッドごとであるため、前のQMgrオブジェクトがまだインスタンス化されている間に新しい接続を作成しようとすると、これが発生します。新しいオブジェクトを作成する前に前の接続を閉じてオブジェクトを破棄した場合は、問題ないはずです。キューやその他のWMQオブジェクトは接続ハンドルに依存しているため、これらも破棄して、新しい接続が確立された後に再インスタンス化する必要があります。

もちろん、この動作については他にもいくつかの説明がありますが、これらの可能性ははるかに低くなります。たとえば、チャネル出口または(WMQ v7の場合)構成によって、特定のIPアドレスからの同時接続の数が制限されている可能性があります。接続が閉じられているのではなく切断されている場合、QMgr側で接続を保持しているチャネルエージェントは、QMgrが接続を閉じていると見なす前にタイムアウトする必要があります。接続制限が設定されている場合、これらの「ゴースト」接続は使用可能なプールを減らします。しかし、私が言ったように、これは、再接続を試みる前に古いオブジェクトをクリーンアップしないプログラムよりもはるかに一般的ではありません。

これはバグである可能性もあります。その可能性を減らすために、またWMQ v6が来年廃止されるなどのさまざまな理由から、このプロジェクトではクライアント側とサーバー側の両方でWMQv7.0.1.2を使用することをお勧めします。一般に、v6の機能に固執する限り、v6.0.xサーバーでv7.0.1.2クライアントを使用できます。特に、.Netコードはv7に統合されており、Cat-3 SupportPacsは、個別のダウンロードではなく、ベースインストールメディアに含まれるようになりました。

于 2010-06-04T11:28:27.367 に答える
1

この問題とIBMのサポートと数か月間戦った後、私が見つけた最善の解決策は、IBMMQDriverの接続/切断コードを変更することです。

GET / PUTごとにmanager.Disconnect()およびmanager.Close()を呼び出す代わりに、一度接続してから、何らかの例外(接続の喪失など)がある場合にのみ再接続します。

私が理解したのは、接続/切断ごとにいくつかの情報をキャッシュするIBMMQDriverにいくつかのバグが存在することです。このバッファがいっぱいになると、アプリケーションは再接続を停止します。

私がこの問題を抱えているドライバーのバージョン(クライアントDLL)は次のとおりです:7.0.1.6

于 2014-07-14T11:57:01.670 に答える