0

以下のコードconnect()メソッドでは、2009 および 2059 の例外をキャッチできます。しかし、getMessage()メソッドで 2009 または 2059 MQ 例外を生成するためにキュー マネージャーまたは接続を停止すると、プログラムがハングするか、スローされませんでした。並んでいqueue.get(retrievedMessage, getOptions);ます。

接続またはキュー マネージャーが壊れている場合にコードに認識させるために、追加の open オプションを追加する必要がありますか?

接続()
{

MQEnvironment.hostname = ホスト名; MQEnvironment.channel = channelName; MQEnvironment.port = ポート名; 試す { qMgr = 新しい MQQueueManager(EvtqManager); // キュー マネージャー オブジェクトを定義します LOGGER.debug("Queue Manager " +EvtqManager+ " インスタンスが初期化されました"); int openOptions = MQC.MQOO_INQUIRE + MQC.MQOO_FAIL_IF_QUIESCING+ MQC.MQOO_INPUT_SHARED; queue = qMgr.accessQueue(queueName, openOptions, null,null,null); LOGGER.debug("IBM MQQueue:"+queueName+" にアクセスしました"); getOptions = 新しい MQGetMessageOptions(); getOptions.options = MQC.MQGMO_NO_WAIT; getMessage(); } キャッチ(){ if(MQex.reasonCode==2009 || MQex.reasonCode==2059){ シャットダウン(); 接続(); } }

getMessage(){ MQMessage を取得したメッセージ。 ながら(真){ 試す { retrieveMessage = 新しい MQMessage(); queue.get(retrievedMessage, getOptions); PCFMessage pcfMessage = 新しい PCFMessage(retrievedMessage); } キャッチ (MQException MQex) { if(MQex.reasonCode==2009 || MQex.reasonCode==2059){ シャットダウン(); 接続(); } } }

`

4

1 に答える 1

1

追加のオプションは必要ありません。MQメソッド呼び出しが進行中で、キュー・マネージャーへの接続が切断された場合、メソッドは理由コード2009またはその他の接続エラー関連の理由コードで戻ります。返される理由コードは、接続が切断された方法によって異なります。たとえば、キュ​​ー・マネージャーがシャットダウンされている場合は、MQRC_Q_MGR_QUIESCING/MQRC_Q_QMGR_STOPPINGが返されます。

ハングは、ソケット障害の検出にかかった時間が原因である可能性があります。したがって、呼び出しがどのくらい待機するかを確認することをお勧めします。

MQRC 2059は、キュー・マネージャーに接続しているときは返されますが、メッセージの受信中は返されません。したがって、2059のチェックを削除できます。

私はあなたのコードに少し戸惑っています。メソッドへの呼び出しshutdown()Connect()内部の呼び出しがConnectありgetMessageます。これが再帰につながると思いませんか?

于 2012-12-01T02:53:50.790 に答える