当消费者正常消费过程中以及Rebalance操作开始之前,都会提交一次Offset记录Consumer当前的消费位置。在SubscriptionState中使用TopicPartitionState记录了每个TopicPartition的消费状况,TopicPartitionState.position字段则记录了消费者下次要从服务端获取的消息的offset。
public void commitOffsetsAsync(final Map<TopicPartition, OffsetAndMetadata> offsets, OffsetCommitCallback callback) {
//将needsFetchCommittedOffsets设置为true
this.subscriptions.needRefreshCommits();
//创建OffsetCommitRequest并添加到unsent队列中
RequestFuture<Void> future = sendOffsetCommitRequest(offsets);
//选择回调函数
final OffsetCommitCallback cb = callback == null ? defaultOffsetCommitCallback : callback;
//添加监听器
future.addListener(new RequestFutureListener<Void>() {
@Override
public void onSuccess(Void value) {
if (interceptors != null)
interceptors.onCommit(offsets);
cb.onComplete(offsets, null);
}