2

私は次のコードを持っています:

        MQQueueManager mqm = null;
        MQQueue mqQueue = null;
        try
        {
            mqm = new MQQueueManager("SWIFTQM", "SWIFTCHANNEL", "localhost");
            mqQueue = mqm.AccessQueue("SWIFTQ", MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_FAIL_IF_QUIESCING);
            MQMessage mqMsg = new MQMessage();
            MQGetMessageOptions mqGetMsgOpts = new MQGetMessageOptions();
            mqGetMsgOpts.Options |= MQC.MQGMO_SYNCPOINT;
            mqQueue.Get(mqMsg, mqGetMsgOpts);
            string s1 = "";
            if (mqMsg.Format.CompareTo(MQC.MQFMT_STRING) == 0)
                s1 = mqMsg.ReadString(mqMsg.MessageLength);
            string s2 = "";
            mqQueue.Get(mqMsg, mqGetMsgOpts);
            if (mqMsg.Format.CompareTo(MQC.MQFMT_STRING) == 0)
                s2 = mqMsg.ReadString(mqMsg.MessageLength);
        }
        finally
        {
            if (mqQueue != null)
                mqQueue.Close();
            if (mqm != null)
                mqm.Disconnect();
            if (mqm != null)
                mqm.Close();
        }

キューには多くのメッセージがありますが、2番目のmqQueue.Getは「MQRC_NO_MSG_AVAILABLE」例外を取得します。不足しているオプションはありますか?

4

1 に答える 1

5

はい、mqMsg = new MQMessage();2 番目のGet呼び出しを行う前に a を実行する必要があります。これは、MQMessageオブジェクトが呼び出し中に着信メッセージ (ヘッダーとメッセージ本文) で初期化されるためですGet。たとえばMessageId、受信メッセージの は MQMessage.MessageId プロパティに設定されます。

お気づきのように、最初の呼び出しで初期化されたオブジェクトで2 番目の呼び出しGetが行われています。これが実質的に意味することは、2 番目の Get 呼び出しは、最初の get 呼び出しで既に受信したメッセージ ID を持つメッセージを探しているということです。しかし、そのメッセージは最初の get 呼び出し自体で既に受信されていました。したがって、2 番目の呼び出しは理由コードで失敗します。MQMessageGetMQRC_NO_MSG_AVAILABLE

また、MQGMO_SYNCPOINTオプションを使用しています。しかしcommit、あなたのコードでは呼び出されていません。このオプションは、ローカル トランザクションでメッセージを受信するためのものです。トランザクション中にメッセージを受信するつもりがない場合は、このオプションを削除する必要がありますmqm.Commit。コミットが呼び出されない場合、メッセージは接続が再確立されたときに再配信されます。

于 2013-02-08T01:59:08.310 に答える