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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:42:56