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

JMS与ActiveMQ异常问题:Quarkus生产者发送的文本消息体被附加奇怪前缀导致无法解析

解决ActiveMQ生产者-消费者消息格式不兼容问题

看起来你的Quarkus生产者(大概率基于ActiveMQ Artemis JMS客户端)和消费者(使用ActiveMQ Classic客户端)之间存在消息格式不兼容的问题,导致你发送的TextMessage被消费者解析成带有协议前缀的BytesMessage,从而无法正确读取内容。

下面是具体的解决方案:

方案1:统一JMS客户端版本

让生产者和消费者使用相同的ActiveMQ客户端实现,从根源上避免格式冲突:

  • 如果消费者使用的是ActiveMQ Classic,将Quarkus的依赖替换为quarkus-activemq(对应Classic的官方JMS客户端),这样两端都使用OpenWire协议,消息类型可以被正确识别。
  • 若继续使用Artemis客户端,将消费者也切换到ActiveMQ Artemis的JMS客户端,这样就能直接解析Artemis的Core消息格式,正确识别TextMessage。

方案2:配置Artemis发送兼容Classic的消息格式

如果想保留现有客户端组合(Quarkus Artemis + Classic消费者),可以在Quarkus的application.properties中添加以下配置,让Artemis发送OpenWire兼容的消息:

quarkus.artemis.jms.use-core-message-type=false

该配置会让Artemis将JMS消息转换为Classic客户端可识别的格式,消费者就能正确收到TextMessage,而不是被解析成BytesMessage。

代码优化建议

即使解决了格式问题,也可以优化消费者代码,增加安全兜底逻辑,避免强制类型转换出错:

String receiveMessage() { 
    MessageConsumer consumer = session.createConsumer(session.createQueue(receiverQueue)); 
    String content = "";
    try { 
        Message message = consumer.receive(); 
        if(message instanceof TextMessage) { 
            content = ((TextMessage) message).getText(); 
        } else if(message instanceof BytesMessage) { 
            BytesMessage byteMessage = (BytesMessage) message; 
            byte[] byteData = new byte[(int) byteMessage.getBodyLength()]; 
            byteMessage.readBytes(byteData); 
            byteMessage.reset(); 
            content = new String(byteData); 
        } else {
            log.warn("Received unknown message type: " + message.getClass().getName());
        }
    } catch (JMSException e) { 
        log.error("Failed to receive message", e); // 打印完整堆栈,方便排查问题
    } 
    return content; 
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:55:35