我有以下代码:
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”异常。我有一个选项吗?
答案 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,则在重新建立连接时将重新传递消息。