Java 在一系列偏移量之间读取来自卡夫卡主题的消息

Java 在一系列偏移量之间读取来自卡夫卡主题的消息,java,apache-kafka,kafka-consumer-api,Java,Apache Kafka,Kafka Consumer Api,我正在寻找一种方法来使用我的卡夫卡主题中具有特定偏移量范围的一些消息集(假设我的分区偏移量为200-300,我希望使用偏移量为250-270的消息) 我使用下面的代码,我可以指定初始偏移量,但它会消耗从250到结束的所有消息。是否有任何方法/属性可用于设置结束偏移量以使用消息直到该点。 KafkaConsumer KafkaConsumer=新的KafkaConsumer(属性); 布尔值keepOnReading=true; //从中读取数据的偏移量。 长偏移距=250L; //seek主


我正在寻找一种方法来使用我的卡夫卡主题中具有特定偏移量范围的一些消息集(假设我的分区偏移量为200-300,我希望使用偏移量为250-270的消息)

我使用下面的代码,我可以指定初始偏移量,但它会消耗从250到结束的所有消息。是否有任何方法/属性可用于设置结束偏移量以使用消息直到该点。

KafkaConsumer KafkaConsumer=新的KafkaConsumer(属性);
布尔值keepOnReading=true;
//从中读取数据的偏移量。
长偏移距=250L;
//seek主要用于重播数据或获取特定消息
//寻找
kafkaConsumer.seek(分割至前置,抵销至前置);
同时(继续阅读){
消费者记录记录=kafkaConsumer.poll(持续时间:百万(100));
对于(消费者记录:记录){
numberOfMessagesRead++;
logger.info(“Key:+record.Key()+”,Value:+record.Value());
logger.info(“分区:+record.Partition()+”,偏移:+record.Offset());
if(record.offset()==270L){
keepOnReading=false;
打破
}
}
}
我希望这对你有帮助

您可以使用,以强制消费者从特定偏移开始消费,然后
poll()
直到达到目标端偏移

公共无效搜索(TopicPartition分区,长偏移量)

覆盖使用者将在下一次
轮询(超时)
时使用的提取偏移量。如果为 同一分区不止一次,最新的偏移量将用于 下一步
poll()
。请注意,如果随意使用此API,可能会丢失数据 用于消费中值,重置取差额


例如,假设您希望从偏移量
200开始:

TopicPartition tp = new TopicPartition("myTopic", 0);
Long startOffset = 200L
Long endOffset = 300L

List<TopicPartition> topics = Arrays.asList(tp);
consumer.assign(topics);
consumer.seek(topicPartition, startOffset);
KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<String, String>(properties);

boolean keepOnReading = true;

// offset to read the data from.
long offsetToReadFrom = 250L; 

// seek is mostly used to replay data or fetch a specific message
// seek
kafkaConsumer.seek(partitionToReadFrom, offsetToReadFrom);

while(keepOnReading) {
   ConsumerRecords<String, String> records = kafkaConsumer.poll(Duration.ofMillis(100));

   for (ConsumerRecord<String, String> record : records) {
      numberOfMessagesRead ++;
      logger.info("Key: "+record.key() + ", Value: " + record.value());
      logger.info("Partition: " + record.partition() + ", Offset: " + record.offset());

      if(record.offset() == 270L) {
        keepOnReading = false;
        break;
      }
   }
}
TopicPartition tp = new TopicPartition("myTopic", 0);
Long startOffset = 200L
Long endOffset = 300L

List<TopicPartition> topics = Arrays.asList(tp);
consumer.assign(topics);
consumer.seek(topicPartition, startOffset);
boolean run = true;
while (run) {
    ConsumerRecords<String, String> records = consumer.poll(1000);
    for (ConsumerRecord<String, String> record : records) {

        // Do whatever you want to do with `record`

        // Check if end offset has been reached
        if (record.offset() == endOffset) {
            run = false;
            break;
        }
    }
}