为什么我会收到 MQRC_NO_MSG_AVAILABLE?

Irm*_*akA 2 .net ibm-mq

我有以下代码:

        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();
        }
Run Code Online (Sandbox Code Playgroud)

尽管队列有很多消息,但第二个 mqQueue.Get 会收到“MQRC_NO_MSG_AVAILABLE”异常。有没有我缺少的选项?

Sha*_*shi 5

是的,您必须mqMsg = new MQMessage();在Get拨打第二个电话之前先做一个。这样做的原因是MQMessage对象在Get调用期间使用传入消息(标题和消息正文)进行初始化。例如MessageId,传入消息的 将设置为 MQMessage.MessageId 属性。

正如您所注意到的,第二个Get是使用MQMessage在第一次Get调用中初始化的对象来调用的。这实际上意味着第二个 Get 调用正在寻找具有您在第一个 get 调用中已收到的消息 ID 的消息。但是该消息已经在第一个 get 调用中收到了。因此第二次调用失败并显示MQRC_NO_MSG_AVAILABLE原因代码。

您也正在使用MQGMO_SYNCPOINT选项。但是commit在您的代码中没有被调用。此选项用于在本地事务中接收消息。如果您不打算在事务下接收消息,则必须删除此选项,否则请执行mqm.Commit. 如果未调用 Commit,则在再次建立连接时将重新传递消息。