public long computePullFromWhere(MessageQueue mq) {
// 如果返回-1,这个队列的rebalance会失败重试,但是不影响其他队列。
long result = -1;
final ConsumeFromWhere consumeFromWhere =
this.defaultMQPushConsumerImpl.getDefaultMQPushConsumer().getConsumeFromWhere();
final OffsetStore offsetStore = this.defaultMQPushConsumerImpl.getOffsetStore();
switch (consumeFromWhere) {
case CONSUME_FROM_LAST_OFFSET_AND_FROM_MIN_WHEN_BOOT_FIRST:
case CONSUME_FROM_MIN_OFFSET:
case CONSUME_FROM_MAX_OFFSET:
case CONSUME_FROM_LAST_OFFSET: {
long lastOffset = offsetStore.readOffset(mq, ReadOffsetType.READ_FROM_STORE);
// 第二次启动,根据上次的消费位点开始消费
if (lastOffset >= 0) {
result = lastOffset;
}
// 第一次启动,没有记录消费位点
else if (-1 == lastOffset) {
// 重试队列则从队列头部开始
if (mq.getTopic().startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX)) {
result = 0L;
}
// 正常队列则从队列尾部开始
else {
try {
result = this.mQClientFactory.getMQAdminImpl().maxOffset(mq);
}
catch (MQClientException e) {
result = -1;
}
}
}
// 其他错误
else {
result = -1;
}
break;
}
case CONSUME_FROM_FIRST_OFFSET: {
long lastOffset = offsetStore.readOffset(mq, ReadOffsetType.READ_FROM_STORE);
// 第二次启动,根据上次的消费位点开始消费
if (lastOffset >= 0) {
result = lastOffset;
}
// 第一次启动,没有记录消费位点
else if (-1 == lastOffset) {
result = 0L;
}
// 其他错误
else {
result = -1;
}
break;
}
case CONSUME_FROM_TIMESTAMP: {
long lastOffset = offsetStore.readOffset(mq, ReadOffsetType.READ_FROM_STORE);
// 第二次启动,根据上次的消费位点开始消费
if (lastOffset >= 0) {
result = lastOffset;
}
// 第一次启动,没有记录消费为点