关于怎么获取kafka指定位置offset消息

本文介绍了如何在Kafka中让特定消费者组从指定主题的起始位置开始消费消息,包括针对新加入的消费者组及已有消费者组的不同处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在kafka中如果不设置消费的信息的话,一个消息只能被一个group.id消费一次,而新加如的group.id则会被“消费管理”记录,并指定从当前记录的消息位置开始向后消费。如果有段时间消费者关闭了,并有发送者发送消息那么下次这个消费者启动时也会接收到,但是我们如果想要从这个topic的第一条消息消费呢?

 

 

 
  1. public class SimpleConsumerPerSonIndex2 {

  2. public static void main(String[] args) throws Exception {

  3.  
  4.  
  5. //Kafka consumer configuration settings

  6. String topicName = "mypartition001";

  7. Properties props = new Properties();

  8.  
  9. props.put("bootstrap.servers", "localhost:9092");

  10. props.put("group.id", "partitiontest112");

  11. props.put("enable.auto.commit", "true");

  12. props.put("auto.commit.interval.ms", "1000");

  13. props.put("session.timeout.ms", "30000");

  14.  
  15. //要发送自定义对象,需要指定对象的反序列化类

  16. props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

  17. props.put("value.deserializer", "com.ys.test.SpringBoot.zktest.encode.DecodeingKafka");

  18. KafkaConsumer<String, Object> consumer = new KafkaConsumer<String, Object>(props);

  19. Map<TopicPartition, OffsetAndMetadata> hashMaps = new HashMap<TopicPartition, OffsetAndMetadata>();

  20. hashMaps.put(new TopicPartition(topicName, 0), new OffsetAndMetadata(0));

  21. consumer.commitSync(hashMaps);

  22. consumer.subscribe(Arrays.asList(topicName));

  23. while (true) {

  24. ConsumerRecords<String, Object> records = consumer.poll(100);

  25. for (ConsumerRecord<String, Object> record : records){

  26. System.out.println(record.toString());

  27. }

  28. }

  29.  
  30. }

  31. }



首先我们在consumer.subscribe(Arrays.asList(topicName));订阅一个topic之前要设置从这个topic的offset为0的地方获取。
注意:这样的方法要保证这个group.id是新加入,如果是以前存在的,那么会抛异常。


2.如果以前就存在的groupid想要获取指定的topic的offset为0开始之后的消息: 


 

 
  1. public class SimpleConsumerPerSonIndex2 {

  2. public static void main(String[] args) throws Exception {

  3.  
  4.  
  5. //Kafka consumer configuration settings

  6. String topicName = "mypartition001";

  7. Properties props = new Properties();

  8.  
  9. props.put("bootstrap.servers", "localhost:9092");

  10. props.put("group.id", "partitiontest002");

  11. props.put("enable.auto.commit", "true");

  12. props.put("auto.commit.interval.ms", "1000");

  13. props.put("session.timeout.ms", "30000");

  14.  
  15. //要发送自定义对象,需要指定对象的反序列化类

  16. props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

  17. props.put("value.deserializer", "com.ys.test.SpringBoot.zktest.encode.DecodeingKafka");

  18. KafkaConsumer<String, Object> consumer = new KafkaConsumer<String, Object>(props);

  19. // consumer.subscribe(Arrays.asList(topicName));

  20. consumer.assign(Arrays.asList(new TopicPartition(topicName, 0)));

  21. consumer.seekToBeginning(Arrays.asList(new TopicPartition(topicName, 0)));//不改变当前offset

  22. // consumer.seek(new TopicPartition(topicName, 0), 10);//不改变当前offset

  23.  
  24. while (true) {

  25. ConsumerRecords<String, Object> records = consumer.poll(100);

  26. for (ConsumerRecord<String, Object> record : records){

  27. System.out.println(record.toString());

  28. }

  29. }

  30.  
  31. }

  32. }


使用 consumer.assign(Arrays.asList(new TopicPartition(topicName, 0)));来分配topic和partition,
 而consumer.seekToBeginning(Arrays.asList(new TopicPartition(topicName, 0)));指定从这个topic和partition的开始位置获取。


 

 

3.存在的groupid获取指定的topic任意的offset

上面的代码放开 consumer.seek(new TopicPartition(topicName, 0), 10);//不改变当前offset
并注释 consumer.seekToBeginning(Arrays.asList(new TopicPartition(topicName, 0)));//不改变当前offset;
其中consumer.seek(new TopicPartition(topicName, 0), 10)中的10是表示从这个topic的partition中的offset为10的开始获取消息。

 

需要注意的是 consumer.assign()是不会被消费者的组管理功能管理的,他相对于是一个临时的,不会改变当前group.id的offset,比如:
在使用consumer.subscribe(Arrays.asList(topicName));时offset为20,如果通过2和3,已经获取了最新的消息offset是最新的,
在下次通过 consumer.subscribe(Arrays.asList(topicName));来获取消息时offset还是20.还是会获取20以后的消息。
其实在2、3的结果截图中我们也可以发现没有1中结果图的joining group的日志输出,表示没有加入到group中。

 

 

[java] view plain copy

  1.   
 
 
 
 
 
 
 

 

转载于:https://my.oschina.net/realmatrix/blog/1843332

Spring Boot可以通过使用Kafka提供的API来指定offset消费消息。 首先,我们需要添加Kafka客户端的依赖。可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> ``` 接下来,我们需要配置Kafka的连接信息。可以在application.properties文件(或application.yml)中添加以下配置: ``` spring.kafka.bootstrap-servers=127.0.0.1:9092 spring.kafka.consumer.group-id=your-group-id spring.kafka.consumer.auto-offset-reset=earliest ``` 其中,`spring.kafka.bootstrap-servers`指定Kafka服务器的地址和端口,`spring.kafka.consumer.group-id`指定了消费者组的ID,`spring.kafka.consumer.auto-offset-reset`指定了消费者在消费消息时的起始位置,这里设置为最早的offset。 然后,我们可以编写一个Kafka消费者来指定offset进行消费。可以创建一个Spring Bean来实现Kafka消息监听器: ```java @Component public class KafkaConsumer { @KafkaListener(topics = "your-topic-name") public void listen(ConsumerRecord<String, String> record) { // 处理消息逻辑 System.out.println("Received message: " + record.value()); } } ``` 在上述代码中,`@KafkaListener`注解指定了要监听的topic名称。当有新的消息到达时,会调用`listen`方法进行处理。 如果需要指定offset进行消费,可以在`listen`方法中添加`@Header`注解,来获取消息offset值: ```java @KafkaListener(topics = "your-topic-name") public void listen(ConsumerRecord<String, String> record, @Header(KafkaHeaders.OFFSET) long offset) { // 获取消息offset值 System.out.println("Received message at offset " + offset + ": " + record.value()); } ``` 以上就是使用Spring Boot和Kafka指定offset消费消息的基本步骤。通过上述配置和代码,我们可以实现具有指定offset功能的Kafka消息消费。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值