【问题标题】:Qpid JMS: Receiving Text Message leads to casting exceptionQpid JMS:接收文本消息导致转换异常
【发布时间】:2019-05-19 03:20:15
【问题描述】:

我正在尝试使用 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。我想知道那个前缀是什么,因为我还没有发送它。我想它一定是一些编码的东西。

如何接收字符串形式的消息?

【问题讨论】:

    标签: java jms qpid


    【解决方案1】:

    QPid JMS 将根据用于描述入站消息的编码和注释方式返回传入消息的基于 TextMessage 的变体。如果您收到一个 BytesMessage 则这意味着正在传递的消息没有被注释为 TextMessage 或者它没有携带指示字符串在正文字节中编码的内容类型,或者它不是 AmqpValue 类型的正文部分它带有一个编码的字符串。

    您的中介可能对消息重新编码不正确,或者您有其他未正确编码的消息排队。

    【讨论】:

    • 我可以看到该消息带有一些 jms 注释。如果这些丢失会发生什么?当然也不能解释为TextMessage。但它不应该在字符串前面放一些东西,不是吗?
    • Qpid JMS 没有,所以我希望中介看看它的作用。
    猜你喜欢
    • 2017-03-09
    • 2015-04-03
    • 2015-05-19
    • 2018-01-02
    • 2012-01-19
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2011-12-12
    相关资源
    最近更新 更多