消费进度存放
存放于conmser实例所在机器的${user.home}/.rocketmq_offsets/MQClientId/ConsumerGroup/offsets.json
文件中
public class LocalFileOffsetStore {
public final static String LOCAL_OFFSET_STORE_DIR = System.getProperty(
"rocketmq.client.localOffsetStoreDir",
System.getProperty("user.home") + File.separator + ".rocketmq_offsets");
this.mQClientFactory = mQClientFactory;
this.groupName = groupName;
this.storePath = LOCAL_OFFSET_STORE_DIR + File.separator +
// clientId默认为DEFAULT
this.mQClientFactory.getClientId() + File.separator +
this.groupName + File.separator +
"offsets.json";
}
}
public class ClientConfig {
private String instanceName = System.getProperty("rocketmq.client.name", "DEFAULT");
}
public class DefaultMQPushConsumerImpl implements MQConsumerInner {
public synchronized void start() throws MQClientException {
//只有在集群模式下,才会将DEFAULT替换成pid
if (this.defaultMQPushConsumer.getMessageModel() == MessageModel.CLUSTERING) {
this.defaultMQPushConsumer.changeInstanceNameToPID();
}
}
}
所以如果你希望在同一台机器上部署同一个ConsumerGroup的多个consumer实例,那么一定一定要自定义实例consumer的instanceName参数,否则会导致不同的consumer实例修改同一份offsets.json文件,导致消费进度错乱。