消息在IBM MQ上被覆盖

时间:2013-04-19 19:19:06

标签: c# .net ibm-mq

我发送了3条消息

Message1 - 相关ID:5000

空消息(无正文/消息)-correlation 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);
              }

如果我不进行长度检查,我将获得与流阅读器相关的异常。

  

我的put方法

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

   mqMsg.WriteString(message);

2 个答案:

答案 0 :(得分: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选项无效。你需要删除它。

更多详细信息浏览选项为here

答案 1 :(得分:2)

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

  1. 您的推送应用程序没有为消息2发送空消息正文。
  2. 您的应用程序正在显示消息缓冲区中的消息缓冲区。如果没有从MQ传递的消息缓冲区,则以前的消息缓冲区内容将保留。
  3. 为了确定发生在你身上的事情,我建议你把所有的消息都放好,但是在运行你的样本之前得到它们,而是运行类似于提供的样本amqsget以排除1的可能性。

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