赞
踩
使用spring-kafka客户端,每次新增topic主题,都需要硬编码客户端并重新发布服务,操作麻烦耗时长。kafkaListener虽可以支持通配符消费topic,缺点是并发数需要手动改并且重启服务 。对于业务逻辑相似场景,创建新主题动态监听可以用kafka-batch-starter组件
1、新增topic名称为:auto.topic1(由于配置spring.kafka.consumer.prefix 为auto,因此只有auto前缀的topic,才会被组件动态监听。)
2、应用输出日志,监听到新增auto.topic1,并初始化客户端 (主题刷新间隔为10s)
3、发新的消息给auto.topic1,可以看到消费成功,不影响原有kafka客户端的消费
接入成功
1、动态接入消息,无需重新发布服务
2、适配spring-kafka配置,和生产运行中的spring-kafka客户端不冲突
1、引入maven依赖坐标
- <dependency>
- <groupId>io.gitee.qrkcn</groupId>
- <artifactId>kafka-batch-starter</artifactId>
- <version>1.0.0</version>
- </dependency>
2、客户端配置,适配spring-kafka原有的配置文件
- spring:
- kafka:
- bootstrap-servers: 172.111.0.1:9092
- consumer:
- prefix: auto
- group-id: kafka-local1
- # 手动提交
- enable-auto-commit: false
- auto-offset-reset: latest
- key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
- value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
- properties:
- auto.commit.interval.ms: 1000
- session.timeout.ms: 60000
- request.timeout.ms: 1000000
- max.poll.interval.ms: 300000 #默认5分钟 300000ms
- max.poll.records: 30 #默认500条
spring.kafka.consumer.prefix 配置说明:
必填,topic名称前缀符合配置,才会动态监听
不填为null,组件抛出自定义异常:Caused by: java.lang.InterruptedException: spring.kafka.consumer.prefix can not be null if use kafka-batch-starter
填入""空字符串,则会动态监听所有主题
3、实现动态消费方法DynamicConsumerMethod
在processMessage中处理业务逻辑
- @Component
- @Slf4j
- public class DynamicConsumerMethodImpl implements DynamicConsumerMethod {
- @Override
- public void processMessage(ConsumerRecords<String, String> records, String topicName) {
- for (ConsumerRecord<String, String> record : records) {
- String key = record.key();
- String value = record.value();
- int partition = record.partition();
- String topic = record.topic();
- log.info("consumer.topicName={},key={},value={}",topicName, key,value);
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。