如何通过JMS向ActiveMQ Artemis队列发送字节消息?类型不生效问题
问题根源与解决方案
你遇到的核心问题是:JMS消息的实际类型由你创建的消息实例决定,setJMSType()只是设置一个应用层的自定义标识,和消息本身的类型无关。
你代码里创建的是TextMessage实例,所以不管你给typeMessage传什么值(3、4、text、byte),Artemis都会识别这是text类型的消息。要发送byte类型的消息,必须创建BytesMessage实例,而不是TextMessage。
修改后的代码示例
import java.nio.charset.StandardCharsets; import javax.jms.BytesMessage; // 其他导入保持不变 public static void sendMessage(QueueSession queueSession, MessageProducer messageProducer, String body, long expiration, String replyTo, int persistent, int priority, Map<String, String> propertiesMap, String CorrelationID, String typeMessage) { try { if (messageProducer == null){ DialogsAlert.queueConnectionError.showAndWait(); } Queue replyToQueue = (Queue) initialContext.lookup("dynamicQueues/" + replyTo); messageProducer.setPriority(priority); messageProducer.setTimeToLive(expiration); messageProducer.setDeliveryMode(persistent); // 创建BytesMessage替代TextMessage BytesMessage message = queueSession.createBytesMessage(); // 将字符串body转换为字节数组写入消息 message.writeBytes(body.getBytes(StandardCharsets.UTF_8)); message.setJMSReplyTo(replyToQueue); message.setJMSCorrelationID(CorrelationID); // 可以继续保留JMSType的设置,作为自定义标识 message.setJMSType(typeMessage); for (Map.Entry<String, String> property : propertiesMap.entrySet()) { if (!property.getKey().isEmpty()) { message.setStringProperty(property.getKey(), property.getValue()); } } messageProducer.send(message); DialogsAlert.messageSendSuccess.showAndWait(); } catch (JMSException | NamingException e) { DialogsAlert.messageSendError.showAndWait(); } }
关键说明
BytesMessage是JMS定义的字节类型消息,Artemis会将其识别为byte类型,这才是改变消息实际类型的正确方式。JMSType字段的作用是给消息添加一个业务层面的类型标记,比如区分不同业务场景的消息,它不会影响消息的底层类型。- 如果你的body本身就是二进制数据(不是字符串),可以直接将字节数组传入
writeBytes(),不需要转字符串再转字节。
内容的提问来源于stack exchange,提问作者user21871375
相关产品推荐
相关产品推荐

