Ошибка IBM MQ .net XMS при чтении байтовых сообщений, ошибка длины байта

#c# #byte #websphere #mq #xms

Вопрос:

У меня есть клиент C# для получения сообщений IBM mq. Я пытаюсь прочитать байтовые сообщения из очереди. Но я получаю следующую ошибку.

Исключение IBM.XMS.MessageEOFException: CWSMQ0136I: Была предпринята попытка прочитать дальше конца сообщения. Была предпринята попытка прочитать дальше конца сообщения. Это может быть нормальным условием, если приложение было закодировано для чтения данных переменной длины с использованием спецификации JMS 1.0.2. При необходимости перекодируйте приложение, чтобы использовать новый метод getBodyLength. в IBM.XMS.Client.Impl.XmsBytesMessageImpl.readUTF()

Я попытался использовать следующий код на C#,

                         var msg = (IBytesMessage)message;
                        var result = msg.ReadUTF();
                        var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(result);
 

Ошибка предполагает, что я использую getBodyLength()
на яве я видел

              byte[] uploadPayload = null;
             BytesMessage bytesMessage = (BytesMessage) receivedMessage; 
             uploadPayload = new byte[(int) bytesMessage.getBodyLength()];
                    bytesMessage.readBytes(uploadPayload);
 

Но как мне это сделать в C#. Я вижу, что это GetBodyLength недоступен ?

Комментарии:

1. Метод readUTF должен использоваться, если входящее сообщение содержит данные в кодировке UTF-8. Обычно readUTF используется, если текст сообщения был написан с использованием метода writeUTF. Если данные не закодированы в кодировке UTF-8, вам следует рассмотреть возможность использования других методов чтения байтов, чтения и т.д. Для чтения данных из сообщения IBytesMessage.

2. Привет, @Sashi, я попробовал readInt (), чтобы получить длину тела, но это неверно. Есть ли способ получить длину байта

Ответ №1:

Надеюсь, этот образец поможет вам. В сообщении есть свойство BodyLength, которое можно использовать для определения длины тела. Я использовал то же самое здесь, в приведенном ниже примере. Вам действительно нужно выделить массив байтов? Если вы знаете формат входящего байтового сообщения, то вы можете просто использовать различные методы чтения класса IBytesMessage для чтения данных. Например, используйте readInt для чтения целочисленных данных, затем, если у вас есть байт, вызовите ReadByte и т. Д.

 void ReceiveMessages()
{
    XMSFactoryFactory factoryFactory;
    IConnectionFactory cf;
    IConnection connectionWMQ;
    ISession sessionWMQ;
    IDestination destination;
    IMessageConsumer consumer;
    IBytesMessage bytesMessage;

    // Get an instance of factory.
    factoryFactory = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);

    // Create WMQ Connection Factory.
    cf = factoryFactory.CreateConnectionFactory();
    Console.WriteLine("Connection Factory created.");

    // Set the properties
    cf.SetStringProperty(XMSC.WMQ_HOST_NAME, "localhost");
    cf.SetIntProperty(XMSC.WMQ_PORT, 1414);
    cf.SetStringProperty(XMSC.WMQ_CHANNEL, "SVR_CHN");
    cf.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, XMSC.WMQ_CM_CLIENT);
    cf.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, "MYQM");
    cf.SetStringProperty(XMSC.USERID, "myuserId");
    cf.SetStringProperty(XMSC.PASSWORD, "mypassw0rd");
    // Create connection.
    connectionWMQ = cf.CreateConnection();
    Console.WriteLine("Connection created.");

    // Create session
    sessionWMQ = connectionWMQ.CreateSession(false, AcknowledgeMode.AutoAcknowledge);
    Console.WriteLine("Session created.");

    // Create destination
    destination = sessionWMQ.CreateQueue("INBQ");
    Console.WriteLine("Destination created.");

    IMessageProducer prod = sessionWMQ.CreateProducer(destination);
    IBytesMessage sendMsg = sessionWMQ.CreateBytesMessage();
    sendMsg.WriteBytes(Encoding.ASCII.GetBytes("Hello world from WMQ"));
    prod.Send(sendMsg);
    // Create consumer
    consumer = sessionWMQ.CreateConsumer(destination);
    Console.WriteLine("Message Consumer created. Starting the connection now.");
    // Start the connection to receive messages.
    connectionWMQ.Start();

    // Wait for 30 seconds for messages. Exit if no message by then
    bytesMessage = (IBytesMessage)consumer.Receive(30000);
    if (bytesMessage != null)
    {
        Console.WriteLine("Message received.");
        byte[] uploadPayload = null;
        uploadPayload = new byte[(int)bytesMessage.BodyLength];
        bytesMessage.ReadBytes(uploadPayload);
        Console.WriteLine(bytesMessage.BodyLength   "n");
    }
    else
        Console.WriteLine("Wait timed out.");

    // Cleanup
    consumer.Close();
    destination.Dispose();
    sessionWMQ.Dispose();
    connectionWMQ.Close();
}