我有以下代码:
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”异常。有没有我缺少的选项?
是的,您必须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,则在再次建立连接时将重新传递消息。