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

如何通过JMS在ActiveMQ Artemis中获取JMSType?返回null问题排查

问题原因及解决方法

原因

getJMSType() 不是用来识别消息实际类型(文本/字节)的方法,它是JMS规范中用于自定义消息业务类型标识的属性,默认值为null。只有在发送消息时主动调用setJMSType()设置过值,这个方法才会返回对应内容。你预期的"text"或"byte"是消息的实际类型(TextMessage/BytesMessage),和JMSType属性没有直接关联。

解决方法

要判断消息是文本还是字节类型,需要通过类型检查实现,示例代码如下:

Enumeration<Message> messageEnumeration = queueBrowser.getEnumeration();
ArrayList<Message> messages = new ArrayList<>();
while (messageEnumeration.hasMoreElements()){
   messages.add(messageEnumeration.nextElement());
}

Message firstMsg = messages.get(0);
System.out.println(firstMsg.getJMSMessageID());

// 判断消息实际类型
if (firstMsg instanceof TextMessage) {
    System.out.println("消息类型:text");
    TextMessage textMsg = (TextMessage) firstMsg;
    // 可获取文本内容
    String content = textMsg.getText();
} else if (firstMsg instanceof BytesMessage) {
    System.out.println("消息类型:byte");
    BytesMessage bytesMsg = (BytesMessage) firstMsg;
    // 可获取字节内容
    byte[] content = new byte[(int) bytesMsg.getBodyLength()];
    bytesMsg.readBytes(content);
} else {
    System.out.println("未知消息类型:" + firstMsg.getClass().getName());
}

如果确实需要让getJMSType()返回预期值,必须在发送消息阶段添加设置代码,比如:

// 发送TextMessage时
TextMessage textMsg = session.createTextMessage("测试内容");
textMsg.setJMSType("text");
producer.send(textMsg);

// 发送BytesMessage时
BytesMessage bytesMsg = session.createBytesMessage();
bytesMsg.writeBytes("测试内容".getBytes());
bytesMsg.setJMSType("byte");
producer.send(bytesMsg);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:07:36