Springboot整合Kafka-控制或关闭消费、动态开启或关闭监听

该博客介绍了如何在Spring Boot应用中使用KafkaListenerEndpointRegistry动态控制Kafka消费者的监听器开启和关闭。通过定义特定的Controller接口,可以根据监听器ID启动或停止监听。此外,还展示了如何配置消费者工厂以禁止监听器自启动,并提供了测试用例验证了监听器的开关效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢! 

  默认情况下,当项目启动时,监听器就开始工作(监听消费发送到指定 topic 的消息)。如果我们想让监听器在程序运行的过程中能够动态地开启、关闭监听器,可以借助 KafkaListenerEndpointRegistry 实现,只需要定义两个 controller 接口分别通过 KafkaListenerEndpointRegistry 来控制监听器的开启、关闭即可,以下记录下测试代码:

  首先改下消费者监听,消费者这边代码没有什么特别的,主要是设置了个消费者 ID(监听器 ID),开启、关闭监听时根据这个ID进行,代码如下:

    @KafkaListener(topics = {"mytest3"},groupId = "test-consumer-group",
            containerFactory = "batchFactory",id = "myListener1")
    public void test(List<String> message){
        System.out.println("接收到的消息:" + message);

    }

 然后新增两个接口控制监听器的开启和关闭,代码如下:

    @Autowired
    private KafkaListenerEndpointRegistry registry;
  
  /**
     * 开启监听
     */
    @GetMapping("/start")
    public void start() {
        // 判断监听容器是否启动,未启动则将其启动
        if (!registry.getListenerContainer("myListener1").isRunning()) {
            registry.getListenerContainer("myListener1").start();
        }
        // 将其恢复
        registry.getListenerContainer("myListener1").resume();
    }

    /**
     * 关闭监听
     */
    @GetMapping("/stop")
    public void stop() {
        // 暂停监听
        registry.getListenerContainer("myListener1").pause();
    }

注意:

1.KafkaListenerEndpointRegistry 在 SpringIO 中已经被注册为 Bean,直接注入使用即可。
2.还需要注意一下启动监听容器的方法,resume 是恢复的意思不是启动的意思。所以我们需要判断容器是否运行,如果运行则调用 resume 方法,否则调用 start 方法。

测试一下,启动项目访问http://localhost:8080/send15 ,控制台打印如下:

访问http://localhost:8080/stop 关闭监听,再次访问http://localhost:8080/send15 ,控制台不再打印消息,说明已经关闭监听。

访问http://localhost:8080/start 再次开启监听,再次访问http://localhost:8080/send15 ,控制台又打印了接收到的消息。

  开始说过,默认情况下,当项目启动时,监听器就开始工作,也可以通过配置在消费者中配置factory.setAutoStartup(false);来禁止消费者监听器自启动,贴一下代码,就不再测试了

    @Bean
    public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, Object>> batchFactory() {
        ConcurrentKafkaListenerContainerFactory<String, Object> factory =
                new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(new DefaultKafkaConsumerFactory<>(consumerConfigs()));
        //并发数量
        factory.setConcurrency(concurrency);
        //开启批量监听
        factory.setBatchListener(type);
        // 被过滤的消息将被丢弃
        factory.setAckDiscarded(true);
        // 设置记录筛选策略
        factory.setRecordFilterStrategy(new RecordFilterStrategy() {
            @Override
            public boolean filter(ConsumerRecord consumerRecord) {
                String msg = consumerRecord.value().toString();
                if(Integer.parseInt(msg.substring(msg.length() - 1)) % 2 == 0){
                    return false;
                }
                // 返回true消息将会被丢弃
                return true;
            }
        });
        // ack模式
        factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE);
        // 禁止消费者监听器自启动
        factory.setAutoStartup(false);
        return factory;
    }

补充:以上是通过接口开启、关闭监听器,也可以使用定时自动开启、关闭监听,例如使用@Scheduled注解实现等。

另外消费者也有pause()和resume()相关方法,看下void pause(Collection<TopicPartition> partitions);从方法注释可以知道这个方法可以暂停从请求的某个分区进行抓取数据(暂停消费某个分区的数据),感兴趣的测试下。

<think>好的,我现在需要帮助用户了解如何在Spring Boot中集成Kafka以实现消息消费。首先,我应该回顾用户提供的引用内容,确保回答准确。用户提供了四个引用,其中提到了配置消费者、动态创建消费者、生产者和消费者的使用方法,以及运行Zookeeper和Kafka服务器的步骤。 第一步,我需要整理出一个清晰的步骤指南。根据引用1,首先要配置和运行Zookeeper和Kafka服务器。然后,引用2和3提到在Spring Boot配置文件中设置消费者参数,比如group id和auto offset reset。同时,引用3还提到了导入依赖包、发送和接收消息的方法。引用4讨论了动态创建消费者的问题,但用户的问题主要是基础配置和使用,所以可能暂时不需要深入动态部分,但可以简要提及。 接下来,我需要确保按照用户的要求使用正确的中文和LaTeX格式。例如,变量配置项如`group-id`应该用$group-id$表示,但根据示例,可能需要用行内代码块更合适,者根据系统级指令,数学表达式才用$...$。这里配置项属于代码,应该用反引号包裹,比如`group-id`。 然后,用户要求生成相关问题,我需要根据教程内容提出相关的问题,例如性能优化、配置参数作用、多消费者处理等。 在结构上,按照用户示例,先分步骤讲解,包括依赖添加、配置文件设置、消费监听器的编写、运行服务器和测试。每个步骤需要结合引用内容,比如在配置文件中设置参数时引用[2]和[3]。同时,代码示例要正确,比如使用@KafkaListener注解,并指出其局限性,引用[4]提到动态创建的问题。 最后,检查是否所有引用都被正确标注,例如在提到配置参数时引用[2],在运行服务器步骤引用[1]。确保没有遗漏关键步骤,比如启动Zookeeper和Kafka服务器,这是消费消息的前提条件。 可能需要注意用户提到的系统级指令中的第5点,生成相关问题,所以需要围绕教程内容提出三个相关问题,例如配置参数的作用、多主题消费的方法、以及如何处理消费异常。 总结整个思考过程,需要将各个引用内容整合到步骤中,确保每个步骤都有对应的引用支持,同时保持回答结构清晰,符合用户的要求。</think>### Spring Boot集成Kafka消费者配置与使用教程 #### 1. 环境准备与依赖配置 - **步骤1**:在`pom.xml`中添加Kafka依赖: ```xml <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> ``` 此依赖提供了Spring Boot对Kafka的集成支持[^3]。 - **步骤2**:配置Kafka消费者参数(`application.yml`): ```yaml spring: kafka: bootstrap-servers: localhost:9092 consumer: group-id: my-consumer-group auto-offset-reset: earliest key-deserializer: org.apache.kafka.common.serialization.StringDeserializer value-deserializer: org.apache.kafka.common.serialization.StringDeserializer ``` 其中: - `group-id`定义消费者组,同一组内消费者共享消息负载[^2]; - `auto-offset-reset: earliest`表示从最早未消费的偏移量开始读取。 #### 2. 实现消息监听 ```java @Component public class KafkaConsumer { @KafkaListener(topics = "my-topic") public void receiveMessage(String message) { System.out.println("Received: " + message); } } ``` - 使用`@KafkaListener`注解监听指定主题,支持多主题如`topics = {"topic1", "topic2"}`; - 默认情况下,消费者为静态配置,若需动态创建需扩展`ConcurrentKafkaListenerContainerFactory`[^4]。 #### 3. 运行与测试 - **步骤1**:启动Zookeeper与Kafka服务器[^1]: ```bash # 启动Zookeeper bin/zookeeper-server-start.sh config/zookeeper.properties # 启动Kafka bin/kafka-server-start.sh config/server.properties ``` - **步骤2**:使用Kafka生产者发送消息: ```java @Autowired private KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String topic, String message) { kafkaTemplate.send(topic, message); } ``` - **步骤3**:启动Spring Boot应用,消费者将自动订阅并消费消息。 --- ###
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值