You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JMS ActiveMQ Artemis中获取字节消息体并转为String?

解决JMS字节消息体转String的问题

你的代码报错javax.jms.MessageFormatException: Body not assignable to class java.lang.String,原因是队列中的消息是BytesMessage类型,getBody(String.class)无法直接将字节类型的消息体转为String——getBody()方法仅支持与消息类型匹配的目标类(比如TextMessage对应String,BytesMessage对应byte[])。

解决方案

先判断消息类型为BytesMessage,读取其字节数组后再转换为String,代码示例如下:

import java.nio.charset.StandardCharsets;
import javax.jms.BytesMessage;
import javax.jms.Message;
import javax.jms.TextMessage;
import java.util.ArrayList;
import java.util.Enumeration;

// 原有的连接逻辑
connectQueueBrowser();
Enumeration<Message> messageEnumeration = queueBrowser.getEnumeration();
ArrayList<Message> messages = new ArrayList<>();
while (messageEnumeration.hasMoreElements()) {
    messages.add(messageEnumeration.nextElement());
}

// 处理第一条消息
Message firstMessage = messages.get(0);
if (firstMessage instanceof BytesMessage) {
    BytesMessage bytesMessage = (BytesMessage) firstMessage;
    try {
        // 获取消息体字节数组长度
        byte[] bodyBytes = new byte[(int) bytesMessage.getBodyLength()];
        bytesMessage.readBytes(bodyBytes);
        // 根据消息发送时的编码转换为String,这里用UTF-8示例
        String bodyString = new String(bodyBytes, StandardCharsets.UTF_8);
        System.out.println(bodyString);
    } catch (Exception e) {
        e.printStackTrace();
    }
} else if (firstMessage instanceof TextMessage) {
    // 兼容处理TextMessage类型的消息
    try {
        System.out.println(((TextMessage) firstMessage).getText());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

注意事项

  • 转换String时必须使用消息发送端的编码格式(比如UTF-8、GBK),否则会出现乱码
  • 建议先做消息类型判断,避免因消息类型不匹配导致的转换异常

内容的提问来源于stack exchange,提问作者user21871375

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:02:09