说,我要检查Kafka中特定分区的第一条和最后一条消息的偏移量。我的想法是将assign(…)
方法与seekToBeginning(…)
和seekToEnd(…)
一起使用。不幸的是,这不起作用。
如果将AUTO_OFFSET_RESET_CONFIG
设置为"latest"
,则seekToBeginning(…)
无效;如果我将其设置为"earliest"
,则seekToEnd(…)
不起作用。看来,对我的消费者来说唯一重要的是AUTO_OFFSET_RESET_CONFIG
。
我见过类似的话题,但是问题是与subscribe()
有关,而不是assign()
方法。提出的解决方案是实现ConsumerRebalanceListner
并将其作为参数传递给subscribe()
方法。不幸的是,assign()
方法只有一个签名,并且只能获取主题分区的列表。
问题是:是否可以将seekToBeginning()
或seekToEnd()
与assign()
方法一起使用。如果是,怎么办?如果没有,为什么?
我的代码的相关片段:
KafkaConsumer<String, ProtoMeasurement> consumer = createConsumer();
TopicPartition zeroP = new TopicPartition(TOPIC, 1);
List<TopicPartition> partitions = Collections.singletonList(zeroP);
consumer.assign(partitions);
consumer.poll(Duration.ofSeconds(1));
consumer.seekToBeginning(partitions);
long currOffsetPos = consumer.position(zeroP);
LOGGER.info("Current offset {}.", currOffsetPos);
ConsumerRecords<String, ProtoMeasurement> records = consumer.poll(Duration.ofMillis(100));
// ...
记录器打印偏移量n,它是所考虑主题的最大(最新)偏移量。
答案 0 :(得分:0)
说,我想检查Kafka中第一条和最后一条消息的偏移量 用于特定分区
您可以为此使用beginningOffsets
和endOffsets
。
问题是:是否可以将
seekToBeginning()
或seekToEnd()
与assign()一起使用
您必须在seekToBeginning
或seekToEnd
之后致电poll()
:
此函数懒惰求值,仅当调用poll(Duration)或position(TopicPartition)时,才寻求所有分区中的第一个偏移量
答案 1 :(得分:-1)
我注意到在MockConsumer中,这种行为是错误的并且不一致。文档说他们很懒,但是会在position()调用之后触发。但这对于MockConsumer而言并非如此。 特别是,我发现它适用于MockConsumer大约在1.0和2.2.2之间,并且在2.3.0之后就失效了
取而代之的是,我选择执行以下操作,该操作在MockConsumer和实际的MockConsumer中始终有效:
// consistently working seed to beginning
consumer.beginningOffsets(partitions).forEach(consumer::seek);
// consistently working seed to end
consumer.endOffsets(partitions).forEach(consumer::seek);
如果有多个线程并发调用poll,这会更加危险,但是在我的情况下效果很好,我只想在应用程序开始轮询时手动控制偏移位置。