3

我正在尝试使用 .Net 客户端使用本地 api [amqmdnet - WebSphere MQ Classes for .NET] 从远程 MQ 接收逻辑分组的消息,这是由 java 客户端使用本地 api 放置的。

当我们得到逻辑分组的消息时,我们会在该组中的所有消息中看到一些标题信息,这些信息将在每个编辑器中以不同的方式显示,[notepad++,editplus 等]

下面指定的标头信息附加在该组中的每个逻辑消息中,例如“MDE”

我们正在使用getmessageoptionsopenoptions如下所示,

mintMQQueueOpenOptions = IBM.WMQ.MQC.MQOO_INPUT_SHARED + IBM.WMQ.MQC.MQOO_FAIL_IF_QUIESCING
mobjMQGetMessageOptions = New MQGetMessageOptions
mobjMQGetMessageOptions.Options = IBM.WMQ.MQC.MQGMO_NO_SYNCPOINT +  IBM.WMQ.MQC.MQGMO_FAIL_IF_QUIESCING
'mobjMQGetMessageOptions.Options = mobjMQGetMessageOptions.Options + MQC.MQGMO_LOGICAL_ORDER  'Or MQC.MQGMO_ALL_MSGS_AVAILABLE

读取该组中所有逻辑消息的代码片段,

            '=================================
            ' INTANTIATE THE MQ MESSAGE OBJECT
            objMQMessage = New MQMessage
            objMQMessage.Format = MQC.MQFMT_STRING
            '=================================
            ' CLEAR THE MESSAGE VARIABLE
            strMQMessage = ""

            Do
                '============================
                ' GET THE MESSAGE FROM THE MQ
                mobjMQQueue.Get(objMQMessage, mobjMQGetMessageOptions)

                '============================
                ' READ THROUGH THE MESSAGE
                strMQMessage += objMQMessage.ReadString(objMQMessage.MessageLength)

                '============================
                ' SET GMO.MATCHOPTIONS TO GROUP ID, INITIALLY IT WAS SET TO "MQC.MQMO_NONE"                            
                mobjMQGetMessageOptions.MatchOptions = MQC.MQMO_MATCH_GROUP_ID

                '============================
                ' DO UNTIL - MESSAGE IS THE LAST IN THE GROUP OR THE GROUP CONSISTS OF ONLY ONE MESSAGE.
            Loop While (mobjMQGetMessageOptions.GroupStatus <> MQC.MQGS_LAST_MSG_IN_GROUP)

            '====================================
            ' COLLECT THE MESSAGE IN AN ARRAYLIST
            If Not String.IsNullOrEmpty(strMQMessage) Then objMQMessageList.Add(strMQMessage)

            '============================
            ' COMMIT THE FETCH OPERATION
            mobjMQQueueManager.Commit()

我们如何从每条消息中删除此标头信息?

4

1 回答 1

2

MQMDE包含存在于版本 2 MQMD 中但不存在于版本 1 MQMD 中的 MQMD 字段。MQMD的信息中心主题概述描述了MQMD版本如何影响 GET 调用的行为:

在 MQGET 调用中,如果应用程序提供版本 1 MQMD,则队列管理器会在返回的消息前加上 MQMDE,但前提是 MQMDE 中的一个或多个字段具有非默认值。MQMD 中的格式字段将具有值 MQFMT_MD_EXTENSION 以指示存在 MQMDE。

基于此,我建议提供一个 Version 2 MQMD。也许这可以解决问题:

            '=================================
            ' INTANTIATE THE MQ MESSAGE OBJECT
            objMQMessage = New MQMessage
            objMQMessage.Version = 2
            objMQMessage.Format  = MQC.MQFMT_STRING
            '=================================

由于objMQMessage被重复用于连续调用,您可能需要在每次 GET 之前设置版本。

IBM MQ 知识中心页面“ MQMDE - 消息描述符扩展 > MQMDE 概述”也包含有关该主题的一些有用信息:

用法:使用版本 2 MQMD 的应用程序不会遇到 MQMDE 结构。但是,专用应用程序和继续使用版本 1 MQMD 的应用程序在某些情况下可能会遇到 MQMDE。MQMDE 结构可能出现在以下情况:

  • 在 MQPUT 和 MQPUT1 调用上指定
  • 由 MQGET 调用返回
  • 在传输队列的消息中
于 2012-11-07T12:22:09.590 回答