Qpid JMS: получение текстового сообщения приводит к исключению приведения - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь отправлять и получать сообщения с Qpid JMS и ProtonJ (AMQP 1.0) и не могу получить TextMessage.Исключение говорит, что оно не может привести JmsBytesMessage к TextMessage:

org.apache.qpid.jms.message.JmsBytesMessage cannot be cast to javax.jms.TextMessage

Даже попытка получить сообщение как JmsTextMessage приводит к:

org.apache.qpid.jms.message.JmsBytesMessage cannot be cast to org.apache.qpid.jms.message.JmsTextMessage

Я отправляю сообщение следующим образом:

  TextMessage textMessage = session.createTextMessage(message)
  Queue queue = session.createQueue(queueName); 
  MessageProducer producer = session.createProducer(queue);
  producer.send(textMessage);

Я пытаюсь получить сообщение с:

    Queue queue = session.createQueue(queueName); 
    MessageConsumer consumer = session.createConsumer(queue);
    connection.start();
    TextMessage message = (TextMessage) consumer.receive();

Поскольку это не сработало, я попытался получить байты и использовать toStringМетод:

 JmsBytesMessage message = (JmsBytesMessage) consumer.receive();  
 String stringMessage = message.toString();

со следующим результатом:

JmsBytesMessage { org.apache.qpid.jms.provider.amqp.message.AmqpJmsBytesMessageFacade@10664b39 }

В следующем тесте я просто использовал байты и превратил их в строку:

 JmsBytesMessage message = (JmsBytesMessage) consumer.receive();
 message.readUTF();
 byte[] byteData = null;
 byteData = new byte[(int) message.getBodyLength()];
 message.readBytes(byteData);
 message.reset();
 String messageString = new String(byteData);

Результат Sw�testmessage.Мне интересно, что это за префикс, поскольку я его не отправил.Я думаю, это должно быть что-то кодирующее.

Как получить сообщение в виде строки?

1 Ответ

0 голосов
/ 18 декабря 2018

QPid JMS вернет вариант входящего сообщения на основе TextMessage, основанный на способе кодирования и аннотациях, которые используются для описания входящего сообщения.Если вы получаете BytesMessage, то это означает, что доставляемое сообщение не аннотировано как TextMessage, или оно не несет тип содержимого, указывающий, что строка кодируется в байтах тела, или это не раздел тела, который является типом AmqpValue.который несет закодированную строку.

Ваш посредник может неправильно закодировать сообщение или у вас в очереди другие сообщения, которые не закодированы должным образом.

...