springboot连接kafka超时处理_springboot源码架构解析KafkaAutoConfiguration

本文深入解析了SpringBoot与Kafka的自动配置过程,详细介绍了`KafkaAutoConfiguration`、`KafkaProperties`等关键类,涵盖消费者、生产者和监听器的配置选项,如自动提交间隔、超时时间、最小数据量等,帮助理解SpringBoot如何与Kafka进行集成并处理超时问题。

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

说在前面

前期回顾

sharding-jdbc源码解析 更新完毕

spring源码解析 更新完毕

spring-mvc源码解析 更新完毕

spring-tx源码解析 更新完毕

spring-boot源码解析 更新完毕

rocketmq源码解析 更新完毕

dubbbo源码解析 更新完毕

netty源码解析 更新完毕

spring源码架构更新完毕

spring-mvc源码架构更新完毕

springboot源码架构更新中

github https://github.com/tianheframe

sharding-jdbc源码解析 更新完毕

rocketmq源码解析 更新完毕

seata 源码解析 更新完毕

dubbo 源码解析 更新完毕

netty 源码解析 更新完毕

源码解析

org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration

kafka自动配置

@Configuration@ConditionalOnClass(KafkaTemplate.class)@EnableConfigurationProperties(KafkaProperties.class)@Import(KafkaAnnotationDrivenConfiguration.class)public class KafkaAutoConfiguration {

监测类KafkaTemplate,解析配置文件KafkaProperties,引入KafkaAnnotationDrivenConfiguration BeanDefinition

org.springframework.boot.autoconfigure.kafka.KafkaProperties

@ConfigurationProperties(prefix = "spring.kafka")public class KafkaProperties {

配置文件以spring.kafka开头

  private List<String> bootstrapServers = new ArrayList<String>(      Collections.singletonList("localhost:9092"));

逗号分隔的主机列表:用于建立到Kafka集群的初始连接的端口对。

  private final Consumer consumer = new Consumer();

consumer

  private final Producer producer = new Producer();

producer

  private final Listener listener = new Listener();

listener

  private final Template template = new Template();

template

org.springframework.boot.autoconfigure.kafka.KafkaProperties.Consumer

    private Integer autoCommitInterval;

如果“enable.auto.commit”为真,则消费者偏移量自动提交到Kafka的频率(以毫秒为单位)。

    private String autoOffsetReset;

如果Kafka中没有初始偏移量,或者当前偏移量在服务器上不存在,该怎么办?

private List<String> bootstrapServers;

逗号分隔的主机列表:用于建立到Kafka集群的初始连接的端口对。

private Boolean enableAutoCommit;

如果为真,使用者的偏移量将在后台定期提交。

private Integer fetchMaxWait;

如果没有足够的数据立即满足“fetch.min.bytes”给出的要求,服务器将在响应fetch请求之前阻塞的最长时间(以毫秒为单位)。

private Integer fetchMinSize;

服务器为获取请求返回的最小数据量(以字节为单位)。

private String groupId;

标识此使用者所属的使用者组的唯一字符串。

private Integer heartbeatInterval;

向消费者协调器发送心跳之间的预期时间(以毫秒为单位)。

private Integer maxPollRecords;

最大拉取的记录数

org.springframework.boot.autoconfigure.kafka.KafkaProperties.Producer

private String acks;

在考虑完成请求之前,生产者要求领导者收到的确认的次数。

private Integer batchSize;

默认批大小(以字节为单位)。较小的批大小将使批处理不那么常见,并可能降低吞吐量(批大小为零将完全禁用批处理)。

private List<String> bootstrapServers;

逗号分隔的主机列表:用于建立到Kafka集群的初始连接的端口对。

private Long bufferMemory;

生产者可以用来缓冲等待发送到服务器的记录的总内存字节数。

private Integer retries;

重试次数

org.springframework.boot.autoconfigure.kafka.KafkaProperties.Template

private String defaultTopic;

默认topic

org.springframework.boot.autoconfigure.kafka.KafkaProperties.Listener

private AckMode ackMode;

ack模式

private Long pollTimeout;

拉取超时时间

private Integer ackCount;

ack次数

private Long ackTime;

ack时间

org.springframework.boot.autoconfigure.kafka.KafkaAnnotationDrivenConfiguration

kafka注解驱动支持

@Configuration@ConditionalOnClass(EnableKafka.class)class KafkaAnnotationDrivenConfiguration {

监测EnableKafka注解

private final KafkaProperties properties;

kafka配置文件

@Bean  @ConditionalOnMissingBean  public ConcurrentKafkaListenerContainerFactoryConfigurer kafkaListenerContainerFactoryConfigurer() {    ConcurrentKafkaListenerContainerFactoryConfigurer configurer = new ConcurrentKafkaListenerContainerFactoryConfigurer();    configurer.setKafkaProperties(this.properties);    return configurer;  }

没初始化过ConcurrentKafkaListenerContainerFactoryConfigurer初始化

@Bean  @ConditionalOnMissingBean(name = "kafkaListenerContainerFactory")  public ConcurrentKafkaListenerContainerFactory, ?> kafkaListenerContainerFactory(      ConcurrentKafkaListenerContainerFactoryConfigurer configurer,      ConsumerFactory<Object, Object> kafkaConsumerFactory) {    ConcurrentKafkaListenerContainerFactory<Object, Object> factory = new ConcurrentKafkaListenerContainerFactory<Object, Object>();    configurer.configure(factory, kafkaConsumerFactory);    return factory;  }

没初始化过kafkaListenerContainerFactory初始化

org.springframework.boot.autoconfigure.kafka.ConcurrentKafkaListenerContainerFactoryConfigurer#configure配置指定的Kafka侦听器容器工厂。可以进一步调优工厂,并覆盖默认设置。

public void configure(      ConcurrentKafkaListenerContainerFactory<Object, Object> listenerContainerFactory,      ConsumerFactory<Object, Object> consumerFactory) {    listenerContainerFactory.setConsumerFactory(consumerFactory);    Listener container = this.properties.getListener();    ContainerProperties containerProperties = listenerContainerFactory        .getContainerProperties();    if (container.getAckMode() != null) {//      ack模式      containerProperties.setAckMode(container.getAckMode());    }    if (container.getAckCount() != null) {//      ack次数      containerProperties.setAckCount(container.getAckCount());    }    if (container.getAckTime() != null) {//      ack时间      containerProperties.setAckTime(container.getAckTime());    }    if (container.getPollTimeout() != null) {//      拉取时间      containerProperties.setPollTimeout(container.getPollTimeout());    }    if (container.getConcurrency() != null) {      listenerContainerFactory.setConcurrency(container.getConcurrency());    }  }
@Configuration  @EnableKafka  @ConditionalOnMissingBean(name = KafkaListenerConfigUtils.KAFKA_LISTENER_ANNOTATION_PROCESSOR_BEAN_NAME)  protected static class EnableKafkaConfiguration {  }

开启kafka注解支持,没检测到internalKafkaListenerAnnotationProcessor加载配置

private final KafkaProperties properties;

kafka配置文件

@Bean  @ConditionalOnMissingBean(KafkaTemplate.class)  public KafkaTemplate, ?> kafkaTemplate(      ProducerFactory<Object, Object> kafkaProducerFactory,      ProducerListener<Object, Object> kafkaProducerListener) {    KafkaTemplate<Object, Object> kafkaTemplate = new KafkaTemplate<Object, Object>(        kafkaProducerFactory);    kafkaTemplate.setProducerListener(kafkaProducerListener);    kafkaTemplate.setDefaultTopic(this.properties.getTemplate().getDefaultTopic());    return kafkaTemplate;  }

初始化KafkaTemplate

@Bean  @ConditionalOnMissingBean(ProducerListener.class)  public ProducerListener<Object, Object> kafkaProducerListener() {    return new LoggingProducerListener<Object, Object>();  }

初始化ProducerListener

@Bean  @ConditionalOnMissingBean(ConsumerFactory.class)  public ConsumerFactory, ?> kafkaConsumerFactory() {    return new DefaultKafkaConsumerFactory<Object, Object>(        this.properties.buildConsumerProperties());  }

初始化ConsumerFactory

@Bean  @ConditionalOnMissingBean(ProducerFactory.class)  public ProducerFactory, ?> kafkaProducerFactory() {    return new DefaultKafkaProducerFactory<Object, Object>(        this.properties.buildProducerProperties());  }

初始化ProducerFactory

说在最后

本次解析仅代表个人观点,仅供参考。

6f0de0d6e10a6b92921cc5171961a5f5.gif

扫码进入技术微信群

61b2db2001584c9d0c5e0e337c4705de.png2a53a94d484af95810529b33ce24f1fc.png74deaff7fd21e31d4eeb3504f174037d.png钉钉技术群

2fbbc38516eece9e5ede23b1dfcc0b53.png

qq技术群

45d2fbc0e298eb236c5d368411c2a560.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值