Qpid JMS:接收文本消息会导致投射异常

时间:2018-12-18 16:44:02

标签: java jms qpid

我正在尝试使用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();

因为这不起作用,所以我尝试获取Bytes并使用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 :(得分:3)

QPid JMS将基于用于描述入站消息的编码和注释的方式返回传入消息的基于TextMessage的变体。如果您正在接收BytesMessage,则表示所传递的消息没有被注释为TextMessage,或者未承载表示字符串在主体字节中编码的内容类型,或者它不是AmqpValue类型的主体部分带有编码的字符串。

您的中介可能重新编码了错误的消息,或者您排队的其他消息未正确编码。