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

