Rocketmq-console 重发消息失败: 208 DESC

文章描述了一种生产环境中遇到的问题,即由于Producer和Broker之间的时间不一致,导致消息无法通过MQAdmin进行重发。问题的关键在于Producer的时间快于Broker,使得查询消息时根据时间点计算的范围错过了实际存储的时间。解决方案是确保Producer和Broker的NTP时间同步,保持时间误差在1秒以内。

背景

在生产环境上发现某条消息无法通过console进行重发,报错信息如下:

org.apache.rocketmq.client.exception.MQClientException: 
CODE: 208 DESC: query message by key finished, but no message.
 For more information, please visit the url, http://rocketmq.apache.org/docs/faq/

原因

MQAdminImpl.class
public MessageExt queryMessageByUniqKey(String topic,
        String uniqKey) throws InterruptedException, MQClientException {

        QueryResult qr = queryMessageByUniqKey(topic, uniqKey, 32,
                MessageClientIDSetter.getNearlyTimeFromID(uniqKey).getTime() - 1000, Long.MAX_VALUE);
        if (qr != null && qr.getMessageList() != null && qr.getMessageList().size() > 0) {
            return qr.getMessageList().get(0);
        } else {
            return null;
        }
    }

从msgId中解析出时间,从该时间点开始查询broker中的信息,接下来用mqadmin命令查看这条消息的相关时间信息

./mqadmin  queryMsgByUniqueKey -n xxx:xxx-t xxx-i 7F0000015xxxxxxx0159
Topic:               xxx
Tags:                [xxx]
Keys:                [xxx]
Queue ID:            7
Queue Offset:        15697
CommitLog Offset:    549800974789
Reconsume Times:     0
Born Timestamp:      2023-04-19 17:31:23,025
Store Timestamp:     2023-04-19 17:31:22,937
Born Host:           ip1:port1
Store Host:          ip2:port2
System Flag:         0

分析

  1. 注意Born和Store两个时间差异,正常来讲 born应该早于store,但实际情况是born 晚于 store,也就时生产者和这台broker之间的系统时间有差异, producer的时间快于broker的时间,导致在查询时候通过 开始时间:2023-04-19 17:31:23,025-1000= 2023-04-19 17:31:22,025查询不到msg,因为在broker中这条消息的存储时间是2023-04-19 17:31:22,937

解决方案

producer、 broker ntp时间同步,误差在1秒以内都能够正常查询到消息

在运行 RocketMQ 控制台 JAR 文件时,如果遇到 `Unable to access jarfile` 错误,通常与路径、文件权限或文件名拼写错误有关。以下是可能导致该问题的常见原因及解决方法: 1. **确认文件路径是否正确** - 确保当前所在的目录是包含 `rocketmq-console-ng-1.0.0.jar` 文件的目录。 - 使用命令 `dir`(Windows)或 `ls`(Linux/macOS)列出当前目录下的文件,确认 JAR 文件是否存在。 例如: ```bash ls ``` 如果未看到 `rocketmq-console-ng-1.0.0.jar` 文件,则需要切换到正确的目录或重新编译生成该文件[^1]。 2. **检查文件名是否拼写正确** - 命令中的 JAR 文件名必须与实际文件名完全一致,包括大小写和扩展名。 - 错误示例:`java -jar rocketmq-console-ng-1.0.jar`(版本号不一致)会导致找不到文件。 3. **确保文件权限允许执行** - 在某些操作系统(如 Linux 或 macOS)上,可能需要赋予 JAR 文件可执行权限。 - 使用以下命令修改权限: ```bash chmod +x rocketmq-console-ng-1.0.0.jar ``` 4. **检查 Java 环境是否安装正确** - 确保已正确安装 Java 并配置了环境变量。 - 可以通过以下命令检查 Java 版本: ```bash java -version ``` - 如果未安装 Java 或版本过低,需安装合适的 JDK 并设置 `JAVA_HOME` 环境变量。 5. **使用完整路径运行 JAR 文件** - 如果当前目录中没有该文件,可以尝试使用完整路径运行 JAR 文件。 - 示例: ```bash java -jar /path/to/your/rocketmq-console-ng-1.0.0.jar ``` 6. **确保编译过程没有问题** - 如果是手动编译的 JAR 文件,需确保编译过程顺利完成,并且目标目录中确实生成了 `rocketmq-console-ng-1.0.0.jar` 文件。 - 使用 Maven 编译时,命令如下: ```bash mvn clean package ``` 7. **启动时指定配置参数** - 在某些情况下,还需要指定 RocketMQ 的 NameServer 地址以避免启动失败- 示例: ```bash java -jar rocketmq-console-ng-1.0.0.jar --rocketmq.config.namesrvAddr=localhost:9876 ``` 确保 `localhost:9876` 与本地或远程启动的 NameServer 地址一致[^3]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值