Java 如何将 JMSBytesMessage 转换为 TextMessage

How to convert JMSBytesMessage to TextMessage in Java

我正在构建一些 MQ 队列连接,我需要将消息队列从 queueReceiver.Receivenowait() 投射到 JMS Textmessage。

因为queueReceiver.Receivenowait()格式是字节,我需要将它转换成Textmessage,以便将消息分解成数组列表。

我已经使用了:

queueReceiver = queueSession.createReceiver(ringQueue);

要获取 Bytemessage,我需要转换为 JMS 文本消息:

List<String> outputList = new ArrayList<String>();
while (loop) {
   TextMessage msgResponse = (TextMessage) bytesMessage;
   if (msgResponse.getText() == null) {
      loop = false;
   } else {
      message = msgResponse.getText();
      outputList.add(message);
      msgResponse.acknowledge();
   }
}

我得到了这个错误代码:

java.lang.ClassCastException: com.ibm.jms.JMSBytesMessage cannot be cast to javax.jms.TextMessage

查看 BytesMessage 的 API 文档可能会揭示一种可能的方法。除此之外,只需从消息中读取字节并使用 new String(bytes, charset) 是一种选择。

检查传入消息以确定类型是否符合您的预期通常是个好主意。

if (message instanceof TextMessage) ...

这样你就可以适当地处理负面案例。

我的猜测是,您并不是真的想将 BytesMessage 转换为 TextMessage,而只是想将 BytesMessage 中的字节数组转换为 String。如果是这样,那么您可以使用这样的代码:

List<String> outputList = new ArrayList<String>();
while (loop) {
   if (bytesMessage instanceof BytesMessage) {
      BytesMessage msgResponse = (BytesMessage) bytesMessage;
      if (msgResponse.getBodyLength() == 0) {
         loop = false;
      } else {
         byte[] bytes = new byte[(int) msgResponse.getBodyLength()];
         msgResponse.readBytes(bytes);
         outputList.add(new String(bytes));
         msgResponse.acknowledge();
      }
   }
}

当然,bytesMessage 每次循环都需要不同的消息。