3

同じ MQ キューに接続している受信者が既に存在する場合、新しい受信者が MQ サーバーに接続できないように MQ サーバーを構成できることがわかっています。エラーは次のようになります。

原因: com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ 呼び出しが compcode '2' ('MQCC_FAILED') 理由 '2042' ('MQRC_OBJECT_IN_USE') で失敗しました

しかし、サーバーまたはクライアントを構成して、新しい受信者が MQ サーバーに接続し、既存の受信者接続を切断できるようにする方法はありますか?

以下は現在、私の受信機がサーバーに接続する方法です。setIntProperty に何かできないだろうか。

cf = new MQQueueConnectionFactory();
cf.setHostName(mqHost);
cf.setPort(mqPort);
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
cf.setQueueManager(mqQueueManager);
cf.setChannel(mqChannel);

conn = (MQQueueConnection) cf.createQueueConnection();
session = (MQQueueSession) conn.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);
queue = (MQQueue) session.createQueue(mqQueue);
receiver = (MQQueueReceiver) session.createReceiver(queue);

ありがとう!

ジェリー

4

1 に答える 1

2

OK、ここではさまざまな概念が混在しています。アプリケーションは CLNTCONN チャネルを使用して QMgr の SVRCONN チャネルに接続しています。Yopu は、メモリとシステム リソースが許す限り、SVRCONN チャネルで多くの接続を持つことができます。接続は問題ありません。

「2042」(「MQRC_OBJECT_IN_USE」) は、プログラムがキューへの排他的アクセスを取得していることを示します。これには 2 つの修正があります。

  1. キューへの排他アクセスを使用しないでください。DEFSOPTキューの値をチェックして、EXCLまたはに設定されているかどうかを確認しますSHARED。共有可能にする必要がある場合は、キュー設定がそれを反映していることを確認してください。
  2. キューを排他的なままにする必要がある場合 (たとえば、メッセージがシーケンスに依存するため)、新しい接続を試行する前に以前の接続を停止します。プログラムが正常に接続を閉じない場合、孤立したチャネル エージェントは接続のキューを開いたままにします。最終的に、エージェントはタイムアウトになり、すべての専用入力キューが再び使用可能になります。プログラムが孤立したチャネルを離れている場合は、プログラムを修正します。短期的な手段として、孤立したチャネルを手動で停止して、入力キューのロックを解放できます。
于 2012-09-11T02:28:32.287 に答える