当前位置: 首页 > 知识库问答 >
问题:

Qpid JMS:接收文本消息导致强制转换异常

习旻
2023-03-14

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

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

共有1个答案

龚博涛
2023-03-14

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

您的中介可能对邮件重新编码不正确,或者您排队的其他邮件编码不正确。

 类似资料:
  • 问题内容: 我是Java的新手,正在尝试理解为什么第一个代码片段不会导致此异常,而第二个代码片段会导致此异常。由于在两种情况下都将字符串数组传递到Arrays.asList中,所以两个代码片段都不应该产生异常还是不产生异常? 第一个代码段(毫无例外): 第二段(导致上述异常): 如果相关,我正在Eclipse Helios中使用JavaSE 1.6。 问题答案: 对我来说(使用Java 1.6.0

  • 方言设置为java,我的drools版本是6.4.0。我如何避免这个错误? 编辑:字符串到int:

  • 例外情况: java.lang.ClassCastException:com.interconnect.library.gcm.util.checkplayServices(util.java:96),com.interconnect.library.gcm.regiseter.handleRegister(regiseter.java:53),com.interconnect.library.g

  • 我可以在命令行上针对Kafka位置安装发送和接收消息。我也可以通过Java代码发送消息。这些消息显示在Kafka命令提示符中。我还有一个Kafka消费者的Java代码。代码昨天收到了消息。但是今天早上没有收到任何消息。代码没有更改。我想知道属性配置是否不太正确。这是我的配置: 制片人: 生产记录设置为 消费者: 对于Java代码: 少了什么?

  • 问题内容: 这是我尝试在Liferay Portal 6.0.6中运行portlet时得到的堆栈跟踪。 任何人都知道发生了什么事吗? 问题答案: 问题已经解决了。如上所述,问题是100%的类路径问题。尽管我用jarscan扫描了所有目录,但我找不到任何冗余。事实证明,我的同事使用了许多不必要的JAR,将它们不必要地添加到了我的WAR中。 现在正在工作! 谢谢大家;-)

  • 问题内容: 尝试将结果集强制转换为映射类时,我收到了hibernate类的类强制转换异常…我能够查看返回的结果集中的数据…但是它以Object []的形式返回我可以将Object []设置为List …我可以正确地进行hibernate映射吗?我从查询中获取了正确的数据,但映射不正确… 映射 映射类 参加班 主要 问题答案: 对于测试,我建议您在产生类强制转换异常的语句周围放置一个try-catc