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();
				}
			}
		}
	}
相关推荐
SheldonChang13 分钟前
Onlyoffice集成与AI交互操作指引(Iframe版)
java·人工智能·ai·vue·onlyoffice·postmessage
数据爬坡ing20 分钟前
C++ 类库管理系统的分析与设计:面向对象开发全流程实践
java·运维·开发语言·c++·软件工程·软件构建·运维开发
DKPT29 分钟前
JVM新生代和老生代比例如何设置?
java·开发语言·jvm·笔记·学习
知彼解己33 分钟前
JVM 运行时数据区域
java·开发语言·jvm
小蒜学长36 分钟前
spring boot驴友结伴游网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
江团1io038 分钟前
一篇文章带你彻底搞懂 JVM 垃圾收集器
java·开发语言·jvm
CodeLongBear38 分钟前
深入理解 JVM 字节码文件:从组成结构到 Arthas 工具实践
java·jvm·后端
青鱼入云41 分钟前
java面试中经常会问到的zookeeper问题有哪些(基础版)
java·面试·java-zookeeper
瑞瑞绮绮1 小时前
分布式事务的Java实践
java·分布式·springcloud
Elastic 中国社区官方博客1 小时前
Elasticsearch 的 JVM 基础知识:指标、内存和监控
java·大数据·elasticsearch·搜索引擎·全文检索