如何在.Net客户端中接收时删除WebSphere MQ分组消息中的消息头信息

时间:2012-11-06 13:20:53

标签: .net ibm-mq

我正在尝试使用原生api [amqmdnet - WebSphere MQ Classes for .NET]使用.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()

我们如何从每封邮件中删除此标头信息?

1 个答案:

答案 0 :(得分:2)

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

  

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

基于此,我建议提供版本2 MQMD。也许这将解决问题:

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

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

IBM MQ知识中心页面“MQMDE - Message descriptor extension > Overview for MQMDE”也提供了有关该主题的一些有用信息:

  

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

     
      
  • 在MQPUT和MQPUT1调用上指定
  •   
  • 通过MQGET调用返回
  •   
  • 传输队列中的消息
  •