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();
        }

虽然队列有很多消息,但第二个 mqQueue.Get 得到“MQRC_NO_MSG_AVAILABLE”异常。有没有我错过的选项?

4

1 回答 1

5

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

如您所见,第二个GetMQMessage在第一次调用中初始化的对象被调用的Get。这实际上意味着第二个 Get 调用正在查找具有您在第一个 get 调用中已经收到的消息 ID 的消息。但是该消息已经在第一个 get 调用本身中收到。MQRC_NO_MSG_AVAILABLE因此,第二次调用因原因码而失败。

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

于 2013-02-08T01:59:08.310 回答