apache / apache/rocketmq-spring

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

Open
#736 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
2.3k
Forks
943
PR merge metrics
No merged PRs in 30d

Description

## 版本

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

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

![Image](https://github.com/user-attachments/assets/a5a87ba6-cf27-4949-89f2-5f82c253aba7)
- `java.io.FileNotFoundException: .\logs\rocketmq\offset\192.168.76.1@rocketmq.abc.com:10111@11716@541846349141899\123_memory_consumer\offsets.json.tmp (文件名、目录名或卷标语法不正确。)`

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

## 原因分析
- `org.apache.rocketmq.client.consumer.store.LocalFileOffsetStore`类生成本地文件路径的代码如下:
``` java
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`)如下
``` java
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或者域名以及冒号加端口号

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.