12、Kafka ------ Kafka 生产者API用法(代码演示生产者发送消息到指定主题)

目录

  • Kafka 生产者API 用法(代码演示)
    • 生产者API 介绍
      • 依赖:
      • 介绍:
      • 使用生产者API发送消息步骤:
    • 生产者发送消息代码演示:
      • 1、创建一个Maven项目
      • 2、依赖
      • 3、代码
      • 4、演示结果
      • 5、一些参数理解
    • 代码
      • 生产者 MessageProducer
      • 依赖

Kafka 生产者API 用法(代码演示)

生产者API 介绍


依赖:

这个依赖就是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发送消息步骤:

使用生产者API发送消息很简单,基本只要两步:

1、创建KafkaProducer对象,创建该对象时要传入Properties对象,用于对该生产者进行配置。

2、调用KafkaProducer对象的send()方法发送消息,调用ProducerRecord的构造器即可创建不同的消息。

3、发送完成后,关闭KafkaProducer对象。



为何 Kafka 的 KafkaProducer 需要一个 Properties 来创建KafkaProducer ?

因为Kafka的Producer API提供了海量的配置选项——如果你将这些配置选项每个都定义成方法,那将是一件让人无比痛苦的事情。

所以Kafka在设计该API时,就直接用了一个Properties来封装所有的配置属性。



生产者发送消息代码演示:


1、创建一个Maven项目

12、Kafka ------ Kafka 生产者API用法(代码演示生产者发送消息到指定主题)_第1张图片

12、Kafka ------ Kafka 生产者API用法(代码演示生产者发送消息到指定主题)_第2张图片



2、依赖

Producer API

<dependency>
	<groupId>org.apache.kafka</groupId>
	<artifactId>kafka-clients</artifactId>
	<version>3.6.1</version>
</dependency>

12、Kafka ------ Kafka 生产者API用法(代码演示生产者发送消息到指定主题)_第3张图片



3、代码

可以到API文档查找消息发送者的示例:

KafkaProducer

12、Kafka ------ Kafka 生产者API用法(代码演示生产者发送消息到指定主题)_第4张图片

如图:

创建一个消息生产者对象,发送20条消息到 test2 主题中去,前10条消息发送带key的消息,后10条消息发送不带key的消息。

12、Kafka ------ Kafka 生产者API用法(代码演示生产者发送消息到指定主题)_第5张图片

12、Kafka ------ Kafka 生产者API用法(代码演示生产者发送消息到指定主题)_第6张图片



4、演示结果

控制台显示发送消息成功,然后再打开小黑窗看具体命令
12、Kafka ------ Kafka 生产者API用法(代码演示生产者发送消息到指定主题)_第7张图片

打开小黑窗,输入这些命令,查看指定主题下的所有消息:

▲ 监听 【指定主题】 的所有消息:
这个监听命令,运行后是一直存在的,会一直监听,有新消息会马上监听出来的。

 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,所以这边就乱码吗,这是正常现象。

12、Kafka ------ Kafka 生产者API用法(代码演示生产者发送消息到指定主题)_第8张图片



5、一些参数理解

acks:Kafka的消息确认机制:

12、Kafka ------ Kafka 生产者API用法(代码演示生产者发送消息到指定主题)_第9张图片

12、Kafka ------ Kafka 生产者API用法(代码演示生产者发送消息到指定主题)_第10张图片



linger.ms:两条消息发送之间间隔等待的时间

linger.ms 是 Kafka中的一个配置属性,用于控制生产者在发送消息之前等待的时间。它表示发送消息的延迟时间(以毫秒为单位)。当生产者调用send()方法发送消息时,如果有未发送的消息存在,并且距离上一次发送消息的时间小于linger.ms,则会等待一段时间再发送

12、Kafka ------ Kafka 生产者API用法(代码演示生产者发送消息到指定主题)_第11张图片

代码

生产者 MessageProducer

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 客户端APIJAR-->
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>3.6.1</version>
        </dependency>
    </dependencies>


</project>

你可能感兴趣的:(Kafka,系列,kafka,分布式)