最后
金三银四到了,送上一个小福利!
===========================================================================
我们先来看一下KafkaProducer的结构
public class ProducerRecord<K,V>{
private final String topic; //主题
private final Integer partition; //分区号
private final Headers headers; //消息头部
private final K key; //键
private final V value; //值
private final Long timestamp; //消息的时间戳
//省略其他成员方法和构造方法
}
-
其中topic和partition字段分别代表消息要发往的主题和分区号。
-
headers字段是消息的头部。
-
key是用来指定消息的键,它不仅是消息的附加信息,还可以用来计算分区号进而可以让消息发往特定的分区。
-
value是指消息体,一般不为空。
-
timestamp是指消息的时间戳,它有CreateTime和LogAppendTime两种类型,前者表示消息创建的时间,后者表示消息追加到日志文件的时间。
在创建真正的生产者实例前需要配置相应的参数。核心参数如下:
-
bootstrap.servers: 该参数用来指定生产者客户端连接Kafka集群所需的broker地址清单。至少要设置两个以上的broker地址信息。
-
key.serializer和value.serializer:broker端接收的消息必须以字节数组(byte[])的形式存在。在发往broker之前需要将消息中对应的key和value做相应的序列化操作来转换成字节数组。
这仅仅是核心必填的参数,当然还有其他的参数配置。参数配置完成以后,我们创建一个生产者实例。
KafkaProducer<Stri ng, String> producer= new KafkaProducer<>(props) ;
KafkaProducer有多个构造方法,在实际应用而言,一般都选用 public KafkaProducer(Properties properties)这个构造方法来创建 KafkaProducer 实例。
KafkaProducer 是线程安全的,可以在多个线程中共享单个 KafkaProducer 实例,也可以将KafkaProducer 实例进行池化来供其他线程调用。
构建消息
构建消息,即创建 ProducerRecord 对象,构造方法有很多,根据需要选择。
public ProducerRecord(String topic, Integer partition, Long timestamp, K key, V value, Iterable
public ProducerRecord(String topic, Integer partition,Long timestamp, K key, V value)
public ProducerRecord(String topic, Integer partition,K key, V value, Iterable
public ProducerRecord(String topic, Integer partition, K key, V value)
public ProducerRecord(String topic, K key, V value)
public ProducerRecord(String topic, V value)
发送消息
创建生产者实例和构建之后,接下来就可以发送消息了,发送消息有以下三种模式:
- 发后即忘(fire-and-forget)
- 只管往Kafka中发送消息而不关心消息是否正确到达。
-
同步(sync)
-
异步(async)
KafkaProducer的send()方法并非是void类型,而是Future类型,send方法有2个重载方法,
public Future send(ProducerRecord<K, V> record)
public Future send(ProducerRecord<K, V> record, Callback callback)
要实现同步的发送方式,可以利用返回的Future对象实现第一种方法
try {
producer.send(record).get();
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}
实际上send()方法本身是异步的,send()方法返回的Future对象可以使调用方稍后获得发送的结果。示例中在执行send()方法之后直接链式调用了get()方法来阻塞等待kafka的响应,知道消息发送成功,或者发生异常。如果发生异常,那么就需要捕获异常并交由外层逻辑处理。
也可以在执行完send()方法之后不直接调用get()方法,如下面的同步方法第二种方式的实现。
try {
Future future = producer.send(record);
RecordMetadata metadata = future.get();
最后:学习总结——MyBtis知识脑图(纯手绘xmind文档)
学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)
除此之外,前文所提及的Alibaba珍藏版mybatis手写文档以及一本小小的MyBatis源码分析文档——《MyBatis源码分析》等等相关的学习笔记文档,也皆可分享给认可的朋友!
档,也皆可分享给认可的朋友!