在开发来自提要的微服务消耗数据时,我们使用ConsumerSeekAware
和seekToBeginning
。准备好后,我们希望消费者使用偏移量。由于文档的原因,我真的无法理解seekToEnd
的含义。这是否意味着它会寻找偏移量(最后一个ACK消息)还是会寻找主题的最后一条消息(无论偏移量如何)并等待新消息?
@Slf4j
public class KafkaSeekOffsetAwareListener implements ConsumerSeekAware {
protected final ThreadLocal<ConsumerSeekCallback> seekCallBack = new ThreadLocal<>();
@Override
public void registerSeekCallback(ConsumerSeekCallback callback) {
log.info("Registering seek callback");
this.seekCallBack.set(callback);
}
@Override
public void onPartitionsAssigned(Map<TopicPartition, Long> assignments, ConsumerSeekCallback callback) {
log.info("Incoming Topic Partitions {}", assignments);
----> assignments.forEach((assignment, assignmentKey) -> assignments.forEach((t, o) -> callback.seekToBeginning(t.topic(), t.partition())));
}
public void onIdleContainer(Map<TopicPartition, Long> assignments, ConsumerSeekCallback callback) {
log.info("Container idle");
}
}
答案 0 :(得分:1)
请参阅JavaDocs:
import asyncio
async def nested():
return 42
async def main():
# Nothing happens if we just call "nested()".
# A coroutine object is created but not awaited,
# so it *won't run at all*.
nested()
# Let's do it differently now and await it:
print(await nested()) # will print "42".
asyncio.run(main())
如您所见,它是纯Apache Kafka客户端。用于Apache Kafka的Spring只不过是对该功能的委派。我什至会说说Apache Kafka的Spring是“ Kafka的客户端”是错误的。它只是围绕标准Apache Kafka客户端的包装器和高级Spring API。
答案 1 :(得分:0)
由于文档的原因,我真的无法理解seekToEnd的含义。这是否意味着它会寻找偏移量(最后一个ACK消息)还是会寻找主题的最后一条消息(无论偏移量如何)并等待新消息?
这些是同一回事。主题中的最后一个偏移量是最后确认的(假设生产者甚至启用了acks},并且寻找到结束确实将消费的“游标”移动到结尾,而不管偏移量
答案 2 :(得分:0)
seekToEnd
就是这个意思;将此位置设置为分区的END,而不考虑此使用者的“当前”位置;下一个收到的记录将是执行查找后添加到分区的下一个记录。
在使用者停止时发布的任何记录都将被跳过。