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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:27:43