1、KafkaProducer构造方法
使用KafkaProducer的api之前需要得到一个KafkaProducer实例,梳理KafkaProducer的构造函数:KafkaProducer一共五个构造器:
//核心构造器
KafkaProducer(ProducerConfig config,
Serializer<K> keySerializer,
Serializer<V> valueSerializer,
Metadata metadata,
KafkaClient kafkaClient)
四个构造,都是调用的核心构造器,然后核心构造方法是一个非pulbic,不能直接使用,
在使用的时候选择public KafkaProducer(Properties properties),或者 public KafkaProducer(Map map)操作简单,也符合kafka一切可配置化的思想。
可以看到在调用核心构造方法时候,配置项已经转化为ProducerConfig对象。
2、KafkaProducer配置实现简介:
-
KafkaProducer的用户和默认配置会在KafkaProducer实例化过程中初始化到KafkaProducer的
producerConfig的成员变量中,private final ProducerConfig producerConfig;
-
ProducerConfig类中定义了所有的KafkaProducer需要的配置,并且负责实现默认的配置初始化。
-
AbstractConfig类是ProducerConfig的父类,ProducerConfig实现了将用户的配置覆盖默认配置,并且将配置分类,并提供了获取各种配置的api
分为已经使用配置:已经用到的配置
解析配置:就是用户配置+自定义配置,
原始用户配置:用户配置
默认配置:默认配置
3、KafkaProducer的配置初始化源码分析
以使用 KafkaProducer(Properties properties)的构造方法为线路进行源码分析。其他构造方法也是一样的。
将properties变成ProducerConfig对象
public KafkaProducer(Properties properties) {
this(new ProducerConfig(properties), null, null, null, null);
}
初始化默认配置
public ProducerConfig(Properties props) {
/**调用父类
* CONFIG是在静态代码块中进行的,静态代码块优先于构造方法
*
* 在这里CONFIG 对象已经被初始化了
* 就是所有的默认的初始化配置已经完成。
*
* 调用父类进行解析配置
*/
super(CONFIG, props);
}
初始化默认配置的静态代码块
/**
* 初始化默认配置的静态代码块
* 所有的配置将会被CONFIG对象包装
默认初始化60项配置
*
*/
static {
CONFIG = new ConfigDef().define(BOOTSTRAP_SERVERS_CONFIG, Type.LIST, Collections.emptyList(), new ConfigDef.NonNullValidator(), Importance.HIGH, CommonClientConfigs.BOOTSTRAP_SERVERS_DOC)
.define(BUFFER_MEMORY_CONFIG, Type.LONG, 32 * 1024 * 1024L, atLeast(0L), Importance.HIGH, BUFFER_MEMORY_DOC)