如何在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
相关产品推荐
相关产品推荐

