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
相关产品推荐
相关产品推荐

