关于@KafkaListener动态订阅消费topic的调研

@KafkaListener注解监听和消费kafka的代码通常如下:

java 复制代码
@KafkaListener(topics = "#{'${topics}'.split(',')}")
public void onMessage(List<ConsumerRecord<String, String>> records) {
	try {
		final List<String> msgs = records.stream().map(ConsumerRecord::value).collect(Collectors.toList());
		msgs.forEach(this::processRecord);
	} catch (Exception e) {
		log.error("KafkaListener_kafka_consume_error.", e);
	}
}

现在的问题是:在程序运行的过程中改变topic,消费者能否自动去订阅和消费修改后的topic ?

遗憾的是,@KafkaListener不具备该能力。程序启动时,会根据@KafkaListener的配置信息初始化消费者并订阅指定的topic。程序运行过程中修改topic,系统不会自动重新读取配置并订阅修改后的topic; 鉴于此,考虑使新topic生效的方法是:

1、修改topic后,重启消费程序;

2、使用Kafka原生客户端,手动初始化消费者并启动消费者线程。在消费者线程中,循环从nacos、redis等第三方数据源获取topic信息,与当前topic比较,如有变化则重新初始化消费者、重新订阅topic;其中,从nacos中获取topic信息可考虑使用@RefreshScope注解;

相关推荐
Bai_Yin5 小时前
Debezium 与 Apache Kafka 的集成方式
分布式·kafka·apache·debezium
(; ̄ェ ̄)。11 小时前
在Nodejs中使用kafka(三)offset偏移量控制策略,数据保存策略
分布式·后端·kafka·node.js
binbinxyz12 小时前
【Kafka系列】Kafka 消息传递保障机制
分布式·kafka
苏生Susheng14 小时前
【SpringBoot整合系列】Kafka的各种模式及Spring Boot整合的使用基础案例
java·spring boot·后端·spring·kafka·消息队列·并发
漫步者TZ18 小时前
【kafka系列】Kafka事务的实现原理
数据库·分布式·kafka
2501_9032386521 小时前
Kafka中commitAsync的使用与实例解析
分布式·kafka·个人开发·linq
不会飞的小龙人1 天前
Kafka消息服务之Java工具类
java·kafka·消息队列·mq
AI航海家(Ethan)2 天前
阶段 1:Kafka基础认知
分布式·kafka
不是谁只是我2 天前
学习kafka和flink
学习·flink·kafka
程序员林北北2 天前
【Golang学习之旅】分布式任务队列(使用 RabbitMQ / Kafka)
java·分布式·学习·云原生·golang·kafka·rabbitmq