1

我正在发送 3 条消息

Message1 - 相关 id:5000

空消息(无正文/消息)-相关 id:5001

Message2 - 相关 id:5002

我的出站队列流程是这样的

Message1 - 相关 id:5000

Message1-correlation id:5001 => 在空消息上覆盖相同的先前消息。*

Message2 - 相关 id:5002

上面的第二行不应该有 Message1,而是空的。有什么想法吗?

我的获取方法

                mqGetMsgOpts = new MQGetMessageOptions();
                if (mqQueue != null)
                {
                    //Get options for the messsage                
                    mqGetMsgOpts.Options = MQC.MQGMO_BROWSE_FIRST | MQC.MQGMO_WAIT |  MQC.MQOO_INQUIRE;
                    mqGetMsgOpts.MatchOptions = MQC.MQMO_NONE;
                    mqGetMsgOpts.WaitInterval = 5000;  // 5 seconds limit for waiting
                }

              if (mqMsg.MessageLength > 0 && mqMsg.DataLength > 0)
              {
                messageData = mqMsg.ReadString(mqMsg.MessageLength);
              }

如果我不做长度检查,我会得到流阅读器相关的异常。

我的放置方法

if(mqQueue==null)
  mqQueue = mqQMgr.AccessQueue("Queue Name", MQC.MQOO_OUTPUT | MQC.MQOO_INPUT_SHARED | MQC.MQOO_INQUIRE);

   mqMsg.WriteString(message);
4

2 回答 2

2

我可以想象两个可能导致这种情况的问题。

  1. 您的放置应用程序没有为消息 2 发送空消息正文。
  2. 您的获取应用程序正在向您显示消息一中的消息缓冲区。如果没有从 MQ 传递的消息缓冲区,您之前的消息缓冲区内容将保留。

为了确定发生在您身上的情况,我建议您放置所有消息,但在运行示例获取它们之前,请运行类似提供的示例 amqsget 以排除 1 的可能性。

然后您可以专注于应用程序中的获取缓冲区。如果 MQ 说返回消息的长度为零,请确保您没有使用它。

于 2014-09-15T15:52:04.420 回答
2

我没有听说过消息在 WMQ 中被覆盖。我怀疑这一定是应用程序的问题。这行代码:

mqGetMsgOpts.Options = MQC.MQGMO_BROWSE_FIRST | MQC.MQGMO_WAIT |  MQC.MQOO_INQUIRE;

MQC.MQGMO_BROWSE_FIRST选项将使 WMQ 始终返回满足 MQMD 结构中指定条件的第一条消息。MQGMO_BROWSE_NEXT如果稍后修改此选项以指定读取队列中的下一条消息,我无法从您的代码片段中看出。

而不是MQC.MQGMO_BROWSE_FIRST您可以指定MQGMO_BROWSE_NEXT选项来连续阅读消息。

您还指定MQC.MQOO_INQUIRE了对 GMO 选项无效的选项。你需要删除它。

更多详细信息浏览选项在这里

于 2013-04-20T14:16:09.343 回答