ネットワーク接続の停止に耐えられる、ある程度インテリジェントな MQ 通信モジュールを実装することを楽しみにしています。接続が失われた場合、基本的には 5 秒ごとに再接続を試みる必要があります。
問題は次のとおりです。読み取りには次のコードを使用します。
queueMessage = new MQMessage();
queueMessage.Format = MQC.MQFMT_STRING;
queueGetMessageOptions = new MQGetMessageOptions();
queueGetMessageOptions.Options = MQC.MQGMO_SYNCPOINT + MQC.MQGMO_WAIT + MQC.MQGMO_FAIL_IF_QUIESCING;
queueGetMessageOptions.WaitInterval = 50;
producerQueue.Get(queueMessage, queueGetMessageOptions);
msg = queueMessage.ReadBytes(queueMessage.MessageLength);
(もちろん、以前に queuemanager に正常に接続するなど)
次の問題が発生しました。このルーチンを実行すると、.Get
接続がないときにコードがハングして.Get
. タイマーを使用してタイムアウトがあるかどうかを確認し (理論的には、それは必要ないはずですよね?)、タイムアウトになったら再接続を試みます。しかし、このタイムアウトが期限切れになると、queuemanager が接続されていることを報告しているのに、明らかに接続されていないことがわかります (物理接続はもう存在しません)。この問題は、SYNCPOINT を使用してから発生しました。書き込み中に接続を切断したとき、またはこの場合、キューマネージャーで切断を強制しようとしたときに同じことが発生しました。だから助けてください、私はどの設定を使用して行き詰まるのを避けGet
、Put
むしろMQException
投げられた、または制御可能な何か?ありがとう!
更新: 次のコードを使用して QueueManager に接続しました。
Hashtable props = new Hashtable();
props.Add(MQC.HOST_NAME_PROPERTY, Host);
props.Add(MQC.PORT_PROPERTY, Port);
props.Add(MQC.CHANNEL_PROPERTY, ChannelInfo);
if(User!="") props.Add(MQC.USER_ID_PROPERTY, User);
if(Password!="") props.Add(MQC.PASSWORD_PROPERTY, Password);
props.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);
queueManager = new MQQueueManager(QueueManagerName, props);
producerQueue = queueManager.AccessQueue(
ProducerQueueName,
MQC.MQOO_INPUT_AS_Q_DEF // open queue for input
+ MQC.MQOO_FAIL_IF_QUIESCING); // but not if MQM stopping
consumerQueue = queueManager.AccessQueue(
ConsumerQueueName,
MQC.MQOO_OUTPUT + MQC.MQOO_BROWSE + MQC.MQOO_INPUT_AS_Q_DEF // open queue for output
+ MQC.MQOO_FAIL_IF_QUIESCING); // but not if MQM stopping
言うまでもなく、通常、コードはうまく機能します。読み取り/書き込み、接続/切断は正常に機能します。現在の問題を把握するだけです。ありがとう!