spring-kafka消费监听程序原理

配置消费者工厂

   /**
     * 构建kafka消费者参数
     *
     * @return kafka消费者参数
     */
    @Bean
    public ConsumerFactory<String, String> consumerFactory() {
        List<String> brokerList = kafkaConfigProperties.getBrokerList();
        if (CollectionUtils.isEmpty(brokerList)) {
            log.info("kafka主机配置为空!");
            throw new IllegalArgumentException("kafka--broker 为空!");
        }
        HashMap<String, Object> hashMap = new HashMap<>();
        // 连接服务器地址
        hashMap.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, StringUtils.join(kafkaConfigProperties.getBrokerList(), ","));
        // key 序列化
        hashMap.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        // value 序列化
        hashMap.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        hashMap.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, Optional.ofNullable(kafkaConfigProperties.getMaxPollRecords()).orElse(500));
        return new DefaultKafkaConsumerFactory<>(hashMap);
    }

配置监听工厂

    /**
     * 构建kafka监听工厂
     *
     * @param consumerFactory 消费者参数
     * @return 监听工厂
     */
    @Bean
    public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory(ConsumerFactory<String, String> consumerFactory) {
        ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(consumerFactory);
        // 设置 分区数
        factory.setConcurrency(Optional.ofNullable(kafkaConfigProperties.getPartitionNum()).orElse(1));
        factory.setBatchListener(true);
        factory.getContainerProperties().setPollTimeout(3000);
        return factory;
    }

构建监听工厂

    /**
     * 构建kafka消费者监听工厂
     *
     * @param consumerInfo 消费者信息
     * @return 监听工厂
     */
    public static KafkaMessageListenerContainer<String, String> buildKafkaListenerContainerFactory(KafkaConsumerInfoDto consumerInfo) {
        ConsumerFactory<String, String> consumerFactory = SpringUtil.getBean("consumerFactory", ConsumerFactory.class);
        // 设置订阅主题
        ContainerProperties containerProperties = new ContainerProperties(consumerInfo.getTopic());
        // 设置分组
        containerProperties.setGroupId(consumerInfo.getGroup());
        // 设置监听 listener
        containerProperties.setMessageListener(new KafkaBatchMessageListener(consumerInfo.getTopic()));
        return new KafkaMessageListenerContainer<>(consumerFactory, containerProperties);
    }

配置消费者管理


@Component
@Slf4j
public class KafkaConsumerManager {

    /**
     * 消费者集合  <consumerId, KafkaConsumerThread>
     */
    private static final Map<String, KafkaMessageListenerContainer<String, String>> KAFKA_CONSUMER_THREAD_MAP = new HashMap<>();

    /**
     * 添加消费者
     *
     * @param consumerInfo 消费者信息
     */
    public synchronized void addConsumer(KafkaConsumerInfoDto consumerInfo) {
        if (ObjectUtils.isEmpty(consumerInfo)) {
            return;
        }
        // 通过 消费者id停止线程
        stopByConsumerId(consumerInfo.getConsumerId());
        // 消费者id
        String consumerId = consumerInfo.getConsumerId();
        // 构建消费者配置信息
        KafkaMessageListenerContainer<String, String> kafkaMessageListener = KafkaUtil.buildKafkaListenerContainerFactory(consumerInfo);

        KAFKA_CONSUMER_THREAD_MAP.put(consumerId, kafkaMessageListener);
        // 启动消费者监听
        kafkaMessageListener.start();
        log.info("创建消费者: {} 成功!", consumerId);
    }

    /**
     * 停止消除
     *
     * @param consumerId 消费者id
     */
    public void stopByConsumerId(String consumerId) {
        if (StringUtils.isEmpty(consumerId)) {
            return;
        }
        KafkaMessageListenerContainer<String, String> kafkaMessageListenerContainer = KAFKA_CONSUMER_THREAD_MAP.get(consumerId);
        if (ObjectUtils.isEmpty(kafkaMessageListenerContainer)) {
            return;
        }
        // 停止消费
        kafkaMessageListenerContainer.stop();
        KAFKA_CONSUMER_THREAD_MAP.remove(consumerId);
        log.info("停止消费者: {} 成功!", consumerId);
    }

}

消费者监听程序

/**
 * kafka批量消费接口
 */
@Slf4j
public class KafkaBatchMessageListener implements BatchConsumerAwareMessageListener<String, String> {

    /**
     * 订阅主题
     */
    private String topic;

    public KafkaBatchMessageListener() { }

    public KafkaBatchMessageListener(String topic) {
        this.topic = topic;
    }

    @Override
    public void onMessage(List<ConsumerRecord<String, String>> list, Consumer<?, ?> consumer) {
        KafkaMessageService kafkaMessageService = SpringUtil.getBean(KafkaMessageService.class);
        List<String> messageList = list.stream().map(ConsumerRecord::value).collect(Collectors.toList());
        kafkaMessageService.saveToFile(messageList, topic);
        log.info("消费数量:{} 条..", list.size());
    }

}

提交执行监听程序

在这里插入图片描述

执行异步线程

在这里插入图片描述

消费者记录拉取

在这里插入图片描述

回调 onMessage

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring-Kafka整合是将Spring框架与Kafka消息系统进行整合,使得开发者能够方便地使用Spring框架进行Kafka消息的生产和消费Spring-Kafka整合提供了以下功能: 1. 自动配置Kafka生产者和消费者。 2. 提供KafkaTemplate用于发送消息。 3. 提供@KafkaListener注解用于监听Kafka主题。 4. 提供KafkaListenerContainerFactory用于创建Kafka监听器容器。 5. 提供KafkaAdmin用于管理Kafka集群。 Spring-Kafka整合的使用步骤如下: 1. 添加Spring-Kafka依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>${spring-kafka.version}</version> </dependency> ``` 2. 配置Kafka连接 在application.properties文件中添加Kafka连接相关配置: ``` spring.kafka.bootstrap-servers=localhost:9092 ``` 3. 编写Kafka生产者 使用KafkaTemplate发送消息: ``` @Autowired private KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String topic, String message) { kafkaTemplate.send(topic, message); } ``` 4. 编写Kafka消费者 使用@KafkaListener注解监听Kafka主题: ``` @KafkaListener(topics = "test-topic") public void receiveMessage(String message) { //消费消息 } ``` 5. 配置Kafka监听器容器 使用KafkaListenerContainerFactory创建Kafka监听器容器: ``` @Bean public KafkaListenerContainerFactory<?> kafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>(); factory.setConsumerFactory(consumerFactory()); factory.setConcurrency(1); factory.getContainerProperties().setPollTimeout(3000); return factory; } ``` 6. 配置Kafka管理器 使用KafkaAdmin创建Kafka管理器: ``` @Bean public KafkaAdmin kafkaAdmin() { Map<String, Object> configs = new HashMap<>(); configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); return new KafkaAdmin(configs); } ``` Spring-Kafka整合的使用可以使得开发者更加方便地使用Kafka消息系统,提高消息的生产和消费效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值