广播消费模式下,本地offsets.json.temp创建失败

未关闭
#736 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
3/5
预计耗时
1-2 天
新手友好度
55/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
冷清
技术栈
java, spring-boot
领域
backend

调研方向

从 DefaultRocketMQListenerContainer#initRocketMQPushConsumer 和对 RocketMQUtil.getInstanceName(nameServer) 的调用开始,然后追踪 ClientConfig#buildMQClientId 如何影响 LocalFileOffsetStore 的 storePath。检查 nameserver 包含冒号时生成的路径在 Windows 上的行为。当广播消费者能够创建 offsets.json.tmp 且不再出现报告的 FileNotFoundException 时,即视为完成。

由索引模型根据 Issue 内容生成。

描述

版本

  • rocketmq-spring-boot-starter:2.2.1
  • rocketmq-client:4.9.2

问题

  • 采用 @RocketMQMessageListener 注解 广播 消费时,查看本地生成的rocketmq_client.log发现如下错误

Image

  • java.io.FileNotFoundException: .\logs\rocketmq\offset\[email protected]:10111@11716@541846349141899\123_memory_consumer\offsets.json.tmp (文件名、目录名或卷标语法不正确。)

  • window环境下,文件夹名称带有冒号导致创建不了文件,就会一直报错

原因分析

  • org.apache.rocketmq.client.consumer.store.LocalFileOffsetStore类生成本地文件路径的代码如下:
    public LocalFileOffsetStore(MQClientInstance mQClientFactory, String groupName) {
        this.mQClientFactory = mQClientFactory;
        this.groupName = groupName;
        this.storePath = LOCAL_OFFSET_STORE_DIR + File.separator +
            this.mQClientFactory.getClientId() + File.separator +
            this.groupName + File.separator +
            "offsets.json";
    }
  • 会用到clientId,而clientId的生成逻辑(org.apache.rocketmq.client.ClientConfig#buildMQClientId)如下
    public String buildMQClientId() {
        StringBuilder sb = new StringBuilder();
        sb.append(this.getClientIP());

        sb.append("@");
        sb.append(this.getInstanceName());
        if (!UtilAll.isBlank(this.unitName)) {
            sb.append("@");
            sb.append(this.unitName);
        }

        return sb.toString();
    }
  • 核心问题出现在方法org.apache.rocketmq.spring.support.DefaultRocketMQListenerContainer#initRocketMQPushConsumer内部,会给消费者初始化 instanceName
    • consumer.setInstanceName(RocketMQUtil.getInstanceName(nameServer));
    • 此方法传入的是nameServer 带有IP或者域名以及冒号加端口号
主要语言
Java
星标
2.3k
派生
941
PR 合并指标
30 天内没有已合并 PR

环境准备

  • 没有 Dockerfile 或 Docker Compose 文件
  • 有 Pull Request 模板
  • 没有贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

apache/rocketmq-spring 的其他 Issue

查看 apache/rocketmq-spring 的全部 Issue

相似的 Issue

更多 Java Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。