apache / apache/rocketmq-spring
广播消费模式下,本地offsets.json.temp创建失败
- 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发现如下错误

- `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.