kafka:消费者从指定时间的偏移开始消费(二)

我的前一篇博客《kafka:AdminClient获取指定主题的所有消费者的消费偏移(一)》为了忽略忽略掉上线之前的所有消息,从获取指定主题的所有消费者的消费偏移并计算出最大偏移来解决此问题。

但这个方案需要使用不常用的AdminClient类,而且如果该主题如果是第一次被消费者拉取消息时,因为得不到消费者的消费偏移,最后的结果,就是从0偏移开始拉取所有消息。并不能真正实现忽略上线之前所有消息的目的。

所以我又优化了方案。基本的原理就是使用KafkaConsumer.offsetsForTimes方法获取消费者的所有主题分区的指定时间的偏移,并将这个偏移作为消费开始的偏移(KafkaConsumer.seek方法) 。

java 复制代码
	@Test
	public void test3SeekToTime() {
		// 配置Kafka消费者的属性
		Properties props = new Properties();
		props.put("bootstrap.servers", "localhost:9092");
		props.put("group.id", "my_consumer_group");
		props.put("key.deserializer", StringDeserializer.class.getName());
		props.put("value.deserializer", StringDeserializer.class.getName());
		// 创建Kafka消费者实例
		try(Consumer<String, String> consumer = new KafkaConsumer<>(props)){			
			boolean seek = false;
			/** 
			 * 循环开始的时间,
			 * 忽略该时间之前的消息
			 */
			long startMills = System.currentTimeMillis();
			while (true) {
				try {
					ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(4000));
					if(!seek) {
						if(!records.isEmpty()) {
							/** 
							 * 获取第一批消息时更新消息偏移到循环开始的时间
							 */
							consumer.offsetsForTimes(Maps.asMap(consumer.assignment(),t->startMills)).forEach((k,v)->{
								if(null != v) {
									System.out.println("seek %s to %s",k,v.offset());
									consumer.seek(k,v.offset());
								}
							});
							seek = true;
						}
						/** 跳过第一批获取到的消息,继续循环 */
						continue;
					}
					records.forEach(record -> {
						String value = record.value();
						System.out.println("Received message: " + value);
					});
				}catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
相关推荐
科兴第一吴彦祖12 分钟前
基于Spring Boot + Vue 3的乡村振兴综合服务平台
java·vue.js·人工智能·spring boot·推荐算法
ajassi200014 分钟前
开源 java android app 开发(十八)最新编译器Android Studio 2025.1.3.7
android·java·开源
纤瘦的鲸鱼18 分钟前
Spring Gateway 全面解析:从入门到进阶实践
java·spring·gateway
用户32941900421632 分钟前
Java接入DeepSeek实现流式、联网、知识库以及多轮问答
java
Knight_AL36 分钟前
浅拷贝与深拷贝详解:概念、代码示例与后端应用场景
android·java·开发语言
DolphinScheduler社区37 分钟前
# 3.1.8<3.2.0<3.3.1,Apache DolphinScheduler集群升级避坑指南
java·大数据·开源·apache·任务调度·海豚调度
Le1Yu1 小时前
黑马商城微服务项目准备工作并了解什么是微服务、SpringCloud
java·微服务·架构
ZhengEnCi1 小时前
🚀创建第一个 SpringBoot 应用-零基础体验开箱即用的神奇魅力
java·spring boot
宠友信息1 小时前
仿小红书短视频APP源码:Java微服务版支持小程序编译的技术解析
java·微服务·音视频
努力努力再努力wz1 小时前
【C++进阶系列】:万字详解智能指针(附模拟实现的源码)
java·linux·c语言·开发语言·数据结构·c++·python