告别命令行:一个开箱即用的 RocketMQ 桌面管理工具
如果你每天都在用
mqadmin查 Topic、看消费进度、拉消息体,或者在服务器上跑一个 rocketmq-console 进程只为偶尔看一眼集群状态——这篇文章可能对你有用。
一个常见的运维场景
周五下午,线上告警:某个消费组积压了 50 万条消息。
你的操作路径大概是这样的:
# 先看哪个消费组积压了
sh mqadmin consumerProgress -n 127.0.0.1:9876
# 找到积压的 group,看看订阅了哪个 topic
sh mqadmin consumerStatus -n 127.0.0.1:9876 -g order-consumer-group
# 拉几条消息看看内容
sh mqadmin queryMsgById -n 127.0.0.1:9876 -i AC100001000012A4B2C3D4E5F6...
# 决定跳过积压
sh mqadmin resetOffsetByTime -n 127.0.0.1:9876 -g order-consumer-group -t order-topic -s now
四个命令,四次复制粘贴 NameServer 地址,消息 ID 还得从上一条命令的输出里找。如果集群开了 ACL 认证,每条命令还得加上 -ak xxx -sk xxx。
这不是什么高难度操作,但足够繁琐。尤其是在需要反复查看消息内容、对比多条消息、快速切换 Topic 的场景下,命令行的效率瓶颈很明显。
为什么不用 rocketmq-console?
rocketmq-console(Web 版控制台)当然能用,但它有几个实际的问题:
部署成本不低。需要 JDK 环境,需要打 JAR 包,需要选端口,需要配置 NameServer 地址。如果集群有多套环境(开发/测试/生产),要么部署多个 console,要么频繁改配置。
安全性顾虑。console 默认无认证,直接暴露集群管理能力。放在内网还好,放在公网就是安全黑洞。生产环境一般不会随便部署。
功能覆盖不全。console 侧重查看,操作能力有限。比如按 msgKey 查消息、按时间戳拉取消息、重置消费位点到指定 offset,这些操作 console 要么不支持,要么操作路径很深。
RocketMQ Manager:桌面原生方案
[RocketMQ Manager是一个 JavaFX 桌面 GUI 工具,定位很简单:把 mqadmin 的常用操作变成点击和输入框。
它能做什么
连接管理
- 支持 NameServer 直连
- 支持 ACL 认证(accessKey/secretKey)
- 支持 TLS 加密传输
- 多套环境配置保存,一键切换

集群总览(驾驶舱)
- 一次加载展示:Broker 数量、Topic 数量、消费组数量、总 TPS
- 采用并行查询(8 线程并发获取消费组统计),数据加载速度比串行快数倍
- 消费组积压量一目了然

Topic 管理
- Topic 列表、队列统计(minOffset/maxOffset/lastUpdate)
- Topic 路由信息(Broker 分布、Master/Slave 角色)
- Topic 配置(读写队列数、权限 R/W、是否顺序消息)
- Topic 消费者详情(消费组、客户端 ID/地址、消费进度、积压量)
- Topic 生产者连接信息

消费组管理
- 消费组列表 + TPS + 积压总量
- 消费组客户端连接信息(clientId、clientAddr、语言、版本)
- 消费组连接元信息(consumeType、messageModel、consumeFromWhere)
- 消费组订阅信息
- 消费组偏移详情(每队列 brokerOffset/consumerOffset/diff)

消息操作
- 六种拉取方式:最早消息、最新消息、按 Offset、按时间戳、按 msgId、按 msgKey
- 消息内容支持 JSON / RAW / XML / HEX 四种格式化展示
- 在线发送消息(支持 tag、keys、body)
- 消息字段完整展示:msgId、uniqKey、queueId、queueOffset、tags、keys、bodySize、bornTimestamp、storeTimestamp、brokerName
偏移量管理
- 跳过消息堆积(resetOffsetByTimestamp 到当前时间,各队列回到最新位点)
- 按指定 offset 重置(resetOffsetNew)
- 按时间戳重置(resetOffsetByTimestamp)
一个细节:连接预热
用过 RocketMQ Admin API 的人可能注意到,DefaultMQAdminExt.start() 首次调用会卡 10-15 秒。这是因为底层需要初始化 MQClientInstance、扫描路由、建立网络连接。
RocketMQ Manager 在应用启动时就后台预热 Admin 和 PullConsumer 连接。用户点击「连接」时,如果配置匹配,直接复用预热好的实例,连接几乎是秒级的。如果配置不匹配(比如改了 NameServer 地址),才会走正常初始化流程。
代码层面,预热逻辑用了一个简单的锁 + 配置指纹机制:
// 构建配置唯一键 — 用于判断预热是否匹配
private String buildConfigKey(ConnectionConfig config) {
return config.getNameServer() + "|" + config.isAuthEnabled() + "|"
+ config.getAccessKey() + "|" + config.getSecretKey() + "|"
+ config.isUseTLS();
}
连接时先检查预热线程是否完成,再比对配置指纹。匹配则复用,不匹配则新建。逻辑不复杂,但实际体验提升明显。
驾驶舱查询优化
另一个值得说的优化是驾驶舱数据加载。
原始方案是串行调用 5 次 API:getClusterInfo → getBrokers → getTopics → 逐 Topic 查消费组 → 逐消费组查 TPS。Topic 多的时候,加载时间可能超过 10 秒。
优化后的方案:
- 2 次 API 拿核心数据:
examineBrokerClusterInfo()+fetchAllTopicList() - 每 Broker 一次获取消费组:
getAllSubscriptionGroup(addr)替代逐 TopicqueryTopicConsumeByWho - 8 线程并行获取消费组 TPS:
examineConsumeStats并发执行,单次超时 5 秒
实测在 3 Broker / 50 Topic / 20 消费组的集群上,驾驶舱加载从 8 秒降到 2 秒以内。
怎么用
安装
1.下载 Windows 安装包
2. 解压到任意目录
3. 双击 RocketMQManager.bat(标准启动)
快速上手
- 启动后输入 NameServer 地址(如
127.0.0.1:9876) - 如果集群开了 ACL,勾选认证并填写 accessKey/secretKey
- 点击连接
- 左侧导航选择功能模块:驾驶舱 / Broker / Topic / 消费组 / 消息
目录结构
RocketMQ-Manager-1.0.0-Windows/
├── RocketMQManager.vbs # 无窗口启动(推荐)
├── RocketMQManager.bat # 标准启动
├── RocketMQManager-Debug.bat # 调试模式(显示日志)
└── app/
├── rocketmq-manager.jar # 主程序
├── lib/ # 依赖 JAR(25 个)
└── javafx/ # 内嵌 JavaFX 运行时
├── lib/ # 4 个 JAR 模块
└── bin/ # 59 个原生 DLL
技术栈
| 层 | 技术 | 版本 |
|---|---|---|
| GUI 框架 | JavaFX | 17(内嵌运行时) |
| 消息中间件 SDK | RocketMQ Client + Tools | 4.9.3 |
| JSON | FastJSON | 1.2.83 |
| 构建 | Maven + Shade Plugin | 3.9.9 |
| 打包 | Bash 脚本 + Python ZIP | - |
| JDK | 17+(编译和运行) | - |
已知限制
- 仅支持 Windows:当前打包只覆盖 Windows,Linux/Mac 用户需自行编译
- RocketMQ 4.x 适配:使用 4.9.3 版本客户端,未测试 5.x 兼容性
- 单集群连接:同时只能连接一个 NameServer 集群
- 无 Topic 创建/删除:当前版本只支持查看和操作,不支持 Topic 的创建和删除
开源信息
- 仓库地址:https://gitee.com/road0329/rocketmq-manager-java
- 开源协议:Apache 2.0
- 欢迎贡献:Issue 反馈 bug、PR 提交功能、Star 表示支持
如果你在日常运维中也被 mqadmin 的参数折腾得够呛,或者不想为偶尔看一眼集群状态就部署一个 Web 服务——试试这个桌面工具,双击就能用,关了就不占资源。
毕竟,工具的价值不在于多强大,而在于顺手。
更多推荐





所有评论(0)