关于@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注解;

相关推荐
我是一颗柠檬1 小时前
【Java项目技术亮点】Outbox事件驱动模式:解决分布式事务的终极方案
java·开发语言·分布式·后端·中间件·kafka
JAVA面经实录91713 小时前
RocketMQ全套学习知识手册
java·kafka·rabbitmq·rocketmq
Kyrie_Li21 小时前
Kafka-安装和配置(搭建环境)
分布式·kafka
SilentSamsara1 天前
消息队列集成:Python + Kafka/RabbitMQ 生产实践
服务器·开发语言·分布式·python·kafka·rabbitmq
我是一颗柠檬1 天前
【Java项目技术亮点】多级缓存一致性方案:Canal+MQ实现数据库与缓存的最终一致
java·数据库·spring·缓存·kafka·rocketmq
Chasing__Dreams1 天前
Kafka--基础知识点--20--消费者平衡协议的增量式重平衡协议
分布式·kafka
IronMurphy1 天前
Kafka拷打!!!
分布式·kafka
JAVA面经实录9172 天前
MQ高频面试题标准答案(Java后端/架构面试背诵版)
java·面试·架构·kafka·rabbitmq
Kyrie_Li2 天前
Kafka-基础知识总结
运维·分布式·kafka
Devin~Y2 天前
从Spring Boot到AI Agent:大厂Java微服务面试三轮实战问答解析
java·spring boot·redis·spring cloud·微服务·ai·kafka