在IBM MQ上重写消息

本文关键字:重写 消息 MQ IBM | 更新日期: 2023-09-27 18:10:00

我正在发送3条消息

Message1 - correlation id:5000

空消息(没有正文/消息)-关联id:5001

Message2 - correlation id:5002

我的出站队列处理如下

Message1 - correlation id:5000

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

Message2 - correlation id:5002

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

get方法

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

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

My put method

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

在IBM MQ上重写消息

我没有听到消息在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选项无效。你得把它去掉

更多详细的浏览选项在这里

我可以想象两种可能的原因。

  1. 您的推杆应用程序没有为消息2发送空消息体。
  2. 您的get应用程序正在显示来自消息1的消息缓冲区。如果没有从MQ传递的消息缓冲区,则将保留以前的消息缓冲区内容。

要确定哪些发生在您身上,我建议您放置所有消息,但在运行示例以获取它们之前,而是运行提供的示例amqsget以排除1的可能性。

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