ActiveMQBytesMessage writeBytes失效:消息无法发送问题排查
问题诊断与解决方案
1. 变量名误用导致属性处理异常
你的消息配置代码中存在变量名错误:
jmsMessage.clearProperties();
实际创建的消息对象是bytesMessage,此处误用未定义的jmsMessage会引发空指针异常或编译错误,修正为:
bytesMessage.clearProperties();
2. BytesMessage未切换到读取模式(核心问题)
ActiveMQ 5.x的BytesMessage在完成内容写入后,必须调用reset()方法切换到读取模式,否则Broker无法正确序列化消息体——这就是日志中size=0、消息无法到达队列的根本原因。
修改消息写入逻辑,添加reset():
// Write Message bytesMessage.clearBody(); bytesMessage.writeBytes(payload); bytesMessage.reset(); // 关键:切换到读取模式,让Broker能读取消息体 log.debug("BytesMessage: {}", bytesMessage);
3. 冗余发送参数优化(非致命)
创建MessageProducer时已指定目标队列,调用send时无需重复传入destination,简化为:
producer.send(bytesMessage);
修正后的完整代码示例
// 构建消息 var bytesMessage = session.createBytesMessage(); bytesMessage.clearProperties(); MessageMetadata metadata = getSomeMetadata(); bytesMessage.setStringProperty("Property", metadata.getSomeProperty()); // 写入并准备消息体 bytesMessage.clearBody(); bytesMessage.writeBytes(payload); bytesMessage.reset(); log.debug("BytesMessage: {}", bytesMessage); // 发送消息 Queue destination = session.createQueue(MY_QUEUE); MessageProducer producer = session.createProducer(destination); producer.send(bytesMessage);
额外排查方向
- 确认
MY_QUEUE常量值与Web控制台的队列名称完全一致(ActiveMQ队列名称区分大小写) - 检查ActiveMQ Broker日志(默认路径
activemq/data/activemq.log),查看是否有消息被拒绝、丢弃的记录 - 验证
BROKER_URL配置正确,确保连接到目标Broker实例
内容的提问来源于stack exchange,提问作者Noel93
相关产品推荐
相关产品推荐

