我正在阅读权威指南卡姆卡,并且在“消费者”一章中有一个关于“重试异步提交”的内容:
获得正确的异步重试提交顺序的简单模式是使用单调递增的序列号。每次提交时增加序列号,并在提交时将序列号添加到 commitAsync 回调中。准备发送重试时,检查回调获得的提交序列号是否等于实例变量;如果是,则没有较新的提交,可以重试。如果实例序列号更高,请不要重试,因为已经发送了新的提交。
对于像我这样的稠密人来说,作者的一个简短例子本来会很棒。对于上面加粗的部分,我尤其不清楚。
任何人都可以阐明这意味着什么,或者甚至可以提供一个玩具示例来证明这一点吗?
答案 0 :(得分:1)
这就是我想的,但是要谦虚,我可能是错的
try {
AtomicInteger atomicInteger = new AtomicInteger(0);
while (true) {
ConsumerRecords<String, String> records = consumer.poll(5);
for (ConsumerRecord<String, String> record : records) {
System.out.format("offset: %d\n", record.offset());
System.out.format("partition: %d\n", record.partition());
System.out.format("timestamp: %d\n", record.timestamp());
System.out.format("timeStampType: %s\n", record.timestampType());
System.out.format("topic: %s\n", record.topic());
System.out.format("key: %s\n", record.key());
System.out.format("value: %s\n", record.value());
}
consumer.commitAsync(new OffsetCommitCallback() {
private int marker = atomicInteger.incrementAndGet();
@Override
public void onComplete(Map<TopicPartition, OffsetAndMetadata> offsets,
Exception exception) {
if (exception != null) {
if (marker == atomicInteger.get()) consumer.commitAsync(this);
} else {
//Cant' try anymore
}
}
});
}
} catch (WakeupException e) {
// ignore for shutdown
} finally {
consumer.commitSync(); //Block
consumer.close();
System.out.println("Closed consumer and we are done");
}