首页 > 解决方案 > XMS IBytesMessage 导致拆分 ZIP 文件出现问题

问题描述

自从将 MQ 升级到“IBM MQ Explorer V9.1”后,在以前版本中一直有效的 XMS 库的行为开始有所不同。

本质上,代码仍将消息识别为 IBytesMessage 类型,并通过 Byte 数组成功将它们写入文件,但文件本身是一个拆分的 zip 文件,无法自行重组。

这是该代码的主要部分:


Dim FactoryFactory As XMSFactoryFactory = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ)

            'Create a ConnectionFactory Object
            cfConnectionFactory = FactoryFactory.CreateConnectionFactory()

            'this variable will contain the full path of any file downloaded from MQ
            Dim strMQMessageOutputFileDestinationFilePath As String = ""

            'This variable will be used to evaluate whether the MQ Message Output file exists
            Dim fiMQMessageOutputFile As FileInfo = Nothing


            'Set various Connection Factory properties
            cfConnectionFactory.SetStringProperty(XMSC.WMQ_HOST_NAME, Me.HostName)
            cfConnectionFactory.SetIntProperty(XMSC.WMQ_PORT, 1414)
            cfConnectionFactory.SetStringProperty(XMSC.WMQ_CHANNEL, "SYSTEM.DEF.SVRCONN")
            cfConnectionFactory.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, 1)


            cfConnectionFactory.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, Me.QueueManager)
            cfConnectionFactory.SetIntProperty(XMSC.WMQ_BROKER_VERSION, 0)


            'Create a new Iconnection object via the Connection Factory
            connection = cfConnectionFactory.CreateConnection()

            'Create a sesion via the Connection Object, using ClientAcknowledge mode
            'ClientAcknowledge is being used because it allows us to control precisely 
            'when a message should be removed from the queue
            session = connection.CreateSession(False, AcknowledgeMode.ClientAcknowledge)


            'Create a destination using the Session Object
            destination = session.CreateQueue(Me.mstrDestinationURI)

            destination.SetIntProperty(XMSC.DELIVERY_MODE, 1)

            'Create a consumer using the Session & Destination Objects
            Consumer = session.CreateConsumer(destination)

            connection.Start()

            'IMessage is the base class that is returned from the Consumer's Receive method
            Dim recvMsg As IMessage = Nothing

            ' Retrieve message from Queue
             recvMsg = Consumer.ReceiveNoWait

                     strFileNameFromMsg = If(Not recvMsg.PropertyExists("fileName"), "",
                     recvMsg.GetStringProperty("fileName"))

                    If TypeOf (recvMsg) Is IBytesMessage Then
                        'Binary Message
                        Dim msg As IBytesMessage = CType(recvMsg, IBytesMessage)
                        Dim buffer(msg.BodyLength) As Byte

                        msg.ReadBytes(buffer)
                        Dim content As String = Text.Encoding.UTF8.GetString(buffer)

                        'The PrepareDestinationFile Function will generate a unique file name for the new file
                        'and ensure that the file does not already exist on the drive
                        strMQMessageOutputFileDestinationFilePath = PrepareDestinationFile(strFileNameFromMsg)


                        'A FileStream object is needed to write a binary array to a file
                        Dim fsZipFile As FileStream = New FileStream(strMQMessageOutputFileDestinationFilePath, FileMode.Create)

                        'Write the contents of the Byte Array to the File via the FileStream object
                        fsZipFile.Write(buffer, 0, buffer.Length)
                        fsZipFile.Close()


                    End If

因此,代码不会引发任何异常 - 代码仍将消息识别为 IBytesMessage,但文件不会正确解压缩。

奇怪的是,如果我们使用 rfhutilc.exe,我们可以手动提取文件,前提是我们将 Write 选项设置为 No Headers 并且不包含 MQMD - 但上面的代码在以前版本的 MQ / XMS 中始终有效

您能提供的任何帮助将不胜感激。

标签: ibm-mqxms

解决方案


推荐阅读