@KafkaListener和KafkaTemplate自动装配原理分析

依赖项和配置信息参见另一篇博文@KafkaListener的配置使用,这里主要借助源码分析@KafkaListener和KafkaTemplate自动装配原理。

1、KafkaAutoConfiguration 源码分析

KafkaAutoConfiguration类自动装配生成了生产者客户端KafkaTemplate的bean和消费者基础ConsumerFactory的bean,KafkaAutoConfiguration导入KafkaAnnotationDrivenConfiguration,KafkaAnnotationDrivenConfiguration最终生成了ConcurrentKafkaListenerContainerFactory的bean, 该bean是@KafkaListener默认使用的容器工厂,即指定了消费的kafka集群。

package org.springframework.boot.autoconfigure.kafka;

import java.io.IOException;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaAdmin;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import org.springframework.kafka.security.jaas.KafkaJaasLoginModuleInitializer;
import org.springframework.kafka.support.LoggingProducerListener;
import org.springframework.kafka.support.ProducerListener;
import org.springframework.kafka.support.converter.RecordMessageConverter;
import org.springframework.kafka.transaction.KafkaTransactionManager;

@Configuration(
    proxyBeanMethods = false
)
/// KafkaTemplate在类路径下存在时,加载该配置类
@ConditionalOnClass({
   
   KafkaTemplate.class})  
@EnableConfigurationProperties({
   
   KafkaProperties.class})
/// 将KafkaAnnotationDrivenConfiguration、KafkaStreamsAnnotationDrivenConfiguration配置类合并过来
@Import({
   
   KafkaAnnotationDrivenConfiguration.class, KafkaStreamsAnnotationDrivenConfiguration.class})  
public class KafkaAutoConfiguration {
   
   

    private final KafkaProperties properties;

    public KafkaAutoConfiguration(KafkaProperties properties) {
   
   
        this.properties = properties;
    }

    @Bean  
    /// KafkaTemplate的bean未定义时,自动生成该bean
    @ConditionalOnMissingBean({
   
   KafkaTemplate.class})
    public KafkaTemp
### 使用 `@KafkaListener` 注解实现 Kafka 消息监听 #### 1. 添加依赖项 为了在 Spring Boot 应用程序中集成 Apache Kafka 并使用 `@KafkaListener` 注解,需先引入必要的 Maven 或 Gradle 依赖项[^2]。 对于 Maven 用户,在项目的 pom.xml 文件内添加如下依赖: ```xml <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> ``` 而对于采用 Gradle 构建工具的情况,则应在 build.gradle 文件里加入这一行: ```groovy implementation 'org.springframework.kafka:spring-kafka' ``` #### 2. 配置 Kafka 属性 接着定义应用所需的 Kafka 连接参数其他设置。这通常是在 application.properties 或者 application.yml 文件完成的。下面给出的是 properties 格式的例子: ```properties spring.kafka.bootstrap-servers=localhost:9092 spring.kafka.consumer.group-id=my-group spring.kafka.consumer.auto-offset-reset=earliest spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer ``` #### 3. 创建消费者逻辑 现在可以编写实际的消息处理器来接收来自特定主题的信息了。这里展示了一个简单的 Java 类片段,它展示了如何利用 `@KafkaListener` 来订阅指定的主题并处理收到的数据[^4]。 ```java import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Service; @Service public class MyConsumer { @KafkaListener(topics = "my-topic", groupId = "${spring.kafka.consumer.group-id}") public void listen(String message) { System.out.println("Received Message: " + message); try { // 处理业务逻辑... // 假设此处执行保存至数据库的操作 } catch (Exception e) { // 错误处理策略应依据实际情况设计 throw new RuntimeException(e); // 可能触发重试机制或其他恢复行为 } } } ``` 当服务端抛出未捕获异常时,默认情况下消息不会被确认已消费,具体表现形式受配置文件里的 ACK 模式影响[^3]。 #### 4. 启动容器自动装配 最后一步是由 `KafkaListenerAnnotationBeanPostProcessor` 负责扫描带有 `@KafkaListener` 的组件,并为其建立相应的监听器容器实例 (`KafkaMessageListenerContainer`) 启动它们的工作流程[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值