为什么我得到MQRC_NO_MSG_AVAILABLE?

时间:2013-02-07 20:37:33

标签: .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();
        }

虽然队列有很多消息,但第二个mqQueue.Get获得“MQRC_NO_MSG_AVAILABLE”异常。我有一个选项吗?

1 个答案:

答案 0 :(得分:4)

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

您可以注意到,在第一个Get调用中初始化了MQMessage对象时,调用了第二个Get。这实际上意味着第二个Get呼叫正在查找具有您在第一次获取呼叫中已收到的消息ID的消息。但是该消息在第一次获取呼叫本身时已经已经。因此,第二次调用失败并带有MQRC_NO_MSG_AVAILABLE原因码。

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