这个依赖就是kafka客户端API的JAR包
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>3.6.1</version>
</dependency>
生产者API 的核心类是 KafkaProducer,它提供了一个 send()方法 来发送消息,该方法需要传入一个 ProducerRecord
ProducerRecord 代表了一条消息,Kafka 的消息是包含了key、value、timestamp。
ProducerRecord定义了如下6个构造器:
- ProducerRecord(String topic, Integer partition, K key, V value):
创建一条发送到指定主题和指定分区的消息。
- ProducerRecord(String topic, Integer partition, K key, V value, Iterable headers):
创建一条发送到指定主题和指定分区的消息,且包含多个消息头。
- ProducerRecord(String topic, Integer partition, Long timestamp, K key, V value):
创建一条发送到指定主题和指定分区的消息,且使用给定的时间戳。
- ProducerRecord(String topic, Integer partition, Long timestamp, K key, V value, Iterable headers):
创建一条发送到指定主题和指定分区的消息、使用给定的时间戳,且包含多个消息头。
- ProducerRecord(String topic, K key, V value):
创建一条发送到指定主题的消息。
- ProducerRecord(String topic, V value):
创建一条发送到指定主题的、只带value,不带key的消息。
Kafka 的API 文档
使用生产者API发送消息很简单,基本只要两步:
1、创建KafkaProducer对象,创建该对象时要传入Properties对象,用于对该生产者进行配置。
2、调用KafkaProducer对象的send()方法发送消息,调用ProducerRecord的构造器即可创建不同的消息。
3、发送完成后,关闭KafkaProducer对象。
为何 Kafka 的 KafkaProducer 需要一个 Properties 来创建KafkaProducer ?
因为Kafka的Producer API提供了海量的配置选项——如果你将这些配置选项每个都定义成方法,那将是一件让人无比痛苦的事情。
所以Kafka在设计该API时,就直接用了一个Properties来封装所有的配置属性。
Producer API
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>3.6.1</version>
</dependency>
可以到API文档查找消息发送者的示例:
KafkaProducer
如图:
创建一个消息生产者对象,发送20条消息到 test2 主题中去,前10条消息发送带key的消息,后10条消息发送不带key的消息。
打开小黑窗,输入这些命令,查看指定主题下的所有消息:
▲ 监听 【指定主题】 的所有消息:
这个监听命令,运行后是一直存在的,会一直监听,有新消息会马上监听出来的。
kafka-console-consumer --bootstrap-server localhost:9092 ^
--topic test2 ^
--from-beginning ^
--property print.timestamp=true ^
--property print.key=true ^
--property print.offset=true ^
--property print.partition=true
可以看到,20条消息成功发送到 test2 主题的分区中,带key的消息发送到分区2中,不带key的消息发送到分区1中。
windows窗口的字符集是GBK,代码设置的是UTF-8,所以这边就乱码吗,这是正常现象。
acks:Kafka的消息确认机制:
linger.ms:两条消息发送之间间隔等待的时间
linger.ms 是 Kafka中的一个配置属性,用于控制生产者在发送消息之前等待的时间。它表示发送消息的延迟时间(以毫秒为单位)。当生产者调用send()方法发送消息时,如果有未发送的消息存在,并且距离上一次发送消息的时间小于linger.ms,则会等待一段时间再发送
package cn.ljh;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
/**
* Properties: Kafka 设计了 Properties 来封装所有的配置属性
*
* KafkaProducer:用来创建消息生产者,是 生产者API 的核心类,
* 它提供了一个 send()方法 来发送消息,该方法需要传入一个 ProducerRecord对象
*
* ProducerRecord:代表了一条消息,Kafka 的消息是包含了key、value、timestamp
*/
public class MessageProducer
{
//主题常量
public static final String TEST_TOPIC = "test2";
public static void main(String[] args)
{
//Properties 中所设置的key,有效的value,可以通过Kafka官方文档来查询生产者API支持哪些配置属性
Properties props = new Properties();
//指定连接Kafka的地址,多个地址之间用逗号隔开
props.put("bootstrap.servers", "localhost:9092,localhost:9093,localhost:9094");
//指定Kafka的消息确认机制
//0:不等待消息确认;1:只等待领导者分区的消息写入之后确认;all:等待所有分区的消息都写入之后才确认
props.put("acks", "all");
//指定消息发送失败的重试多少次
props.put("retries", 0);
//控制生产者在发送消息之前等待的时间
//props.put("linger.ms", 3);
//设置序列化器
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
//1、创建 KafkaProducer 时,需要传入 Properties 对象来配置消息生产者
Producer<String, String> producer = new KafkaProducer<>(props);
//2、发送消息
for (int i = 0; i < 20; i++)
{
var msg = "这是第【 " + (i + 1) + " 】条消息!";
if (i < 10)
{
//发送带 key 的消息
producer.send(new ProducerRecord<String, String>(TEST_TOPIC, "ljh", msg));
} else
{
//发送不带 key 的消息
producer.send(new ProducerRecord<String, String>(TEST_TOPIC, msg));
}
}
System.out.println("消息发送成功!");
//3、关闭资源
producer.close();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.ljh</groupId>
<artifactId>kafkaproducertest</artifactId>
<version>1.0.0</version>
<!-- 项目名,和 artifactId 保持一致 -->
<name>kafkaproducertest</name>
<properties>
<!-- 在这里指定编译器的版本 -->
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 导入 Kafka 客户端API的JAR包 -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>3.6.1</version>
</dependency>
</dependencies>
</project>