Kafka-Java一:Spring实现kafka消息的简单发送

目录

写在前面

一、创建maven项目

二、引入依赖

2.1、maven项目创建完成后,需要引入以下依赖

2.2、创建工程目录

三、创建生产者

3.1、创建生产者,同步发送消息

3.2、创建生产者,异步发送消息

四、同步发送消息和异步发送消息的区别

五、报错处理思路


写在前面

该文章通过spring只实现消息的简单发送,不实现消息的监听。

一、创建maven项目

创建maven过程不再赘述。

二、引入依赖

2.1、maven项目创建完成后,需要引入以下依赖

java 复制代码
    // kafka 依赖
    <dependency>
      <groupId>org.apache.kafka</groupId>
      <artifactId>kafka-clients</artifactId>
      <version>3.4.0</version>
    </dependency>

   //  json依赖,demo中可能会用到该依赖,与kafka依赖无关
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>2.0.10</version>
    </dependency>

2.2、创建工程目录

三、创建生产者

3.1、创建生产者,同步发送消息

3.1.1、在MyProducer中实现如下代码

java 复制代码
package com.demo.lxb.kafka;

import com.alibaba.fastjson.JSON;
import com.demo.lxb.entiry.Order;
import org.apache.kafka.clients.producer.*;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;

/**
 * @Description:
 * @Author: lvxiaobu
 * @Date: 2023-10-23 17:06
 **/
public class MyProducer {

    private final  static String TOPIC_NAME = "topic0921";

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Properties props = new Properties();
        // 一、设置参数
        // 配置kafka地址
        //props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.151.28:9092"); // 单机配置
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
                "192.168.151.28:9092,192.168.151.28:9092,192.168.151.28:9092"); // 集群配置
        // 配置消息 键值的序列化规则
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());

        // 二、声明消息对象
        // 未指定发送分区,具体撒送分区的计算公式: hash(key)%PartitionNum
        // 创建发送的消息: producerRecord
          // 参数1: 要发送的主题
          // 参数2: 消息的key值,可有可无,如果存在的话,该字段用来带入分区的计算公式
          // 参数3: value,具体的消息的内容,json格式的字符串
        ProducerRecord<String,String> producerRecord = new ProducerRecord<String, String>
                            (TOPIC_NAME,
                            "mykey",
                            "hello-kafka");
        // 三、声明消息发送者
        Producer<String,String> producer = new KafkaProducer<String,String>(props);
        // 开发发送,并返回结果和元数据
        RecordMetadata recordMetadata = producer.send(producerRecord).get();

        System.out.println("发送消息结果: " + "topic-" + recordMetadata.topic() + " | partition-"
                + recordMetadata.partition() + " | offset-" + recordMetadata.offset());
    }
}

执行main方法,结果如下:

如果多次执行main方法,会发现offset偏移量的数字会发生变化。

3.2、创建生产者,异步发送消息

3.2.1、在MyProducer2中实现如下代码

java 复制代码
package com.demo.lxb.kafka;

import org.apache.kafka.clients.producer.*;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;
import java.util.concurrent.ExecutionException;

/**
 * @Description: kafka 异步发送消息
 * @Author: lvxiaobu
 * @Date: 2023-10-23 17:06
 **/
public class MyProducer2 {

    private final  static String TOPIC_NAME = "topic0921";

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Properties props = new Properties();
        // 一、设置参数
        // 配置kafka地址
//        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
//                "192.168.151.28:9092"); // 单机配置
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
                "192.168.154.128:9092,192.168.154.128:9093,192.168.154.128:9094"); // 集群配置
        // 配置消息 键值的序列化规则
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());

        // 二、声明消息对象
        // 未指定发送分区,具体撒送分区的计算公式: hash(key)%PartitionNum
        // 创建发送的消息: producerRecord
          // 参数1: 要发送的主题
          // 参数2: 消息的key值,可有可无,如果存在的话,该字段用来带入分区的计算公式
          // 参数3: value,具体的消息的内容,json格式的字符串
        ProducerRecord<String,String> producerRecord = new ProducerRecord<String, String>
                            (TOPIC_NAME,
                            "mykey",
                            "hello-kafka2");
        // 三、声明消息发送者
        Producer<String,String> producer = new KafkaProducer<String,String>(props);
        // 异步发送消息,通过callback回调函数获取发送结果
        producer.send(producerRecord, new Callback() {
            public void onCompletion(RecordMetadata recordMetadata, Exception e) {
                if(e != null){
                    System.out.println("消息发送失败:" + e);
                }
                if(recordMetadata != null){
                    System.out.println("发送消息结果: " + "topic-" + recordMetadata.topic() + " | partition-"
                            + recordMetadata.partition() + " | offset-" + recordMetadata.offset());
                }
            }
        });

        Thread.sleep(50000L);

    }
}

执行 Main方法,会产生和同步发送消息一样的结果。

说明:Thread.sleep(50000L)是让主线程休眠50s,否则主线程在异步发送了消息以后就直接结束了,不会再输出callback中的输出语句

四、同步发送消息和异步发送消息的区别

消息的同步发送

如果生产者发送的消息没有收到kafka的ack通知,生产者会产生阻塞,如果阻塞了3s仍然没有收到消息反馈,会进行消息发送的重试操作,重试的次数是3次。如果三次以后还不行,代码将抛出异常
消息的异步发送

生产者发送消息后,会提供一个callback的回调方法,callback会获取消息是否发送成功的结果。但是需要注意,异步发送消息会出现消息的丢失。

五、报错处理思路

3.2.1、检查Props配置Kafka地址是否正确

3.2.2、检查Linux是否关闭防火墙

相关推荐
NE_STOP14 小时前
Vide Coding--AI编程工具的选择
java
摇滚侠14 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
码云数智-园园14 小时前
C++20 Modules 模块详解
java·开发语言·spring
程序员黑豆14 小时前
JDK 下载安装与配置详细教程
java·前端·ai编程
bush414 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行52014 小时前
Linux 11 动态监控指令top
linux
小宇宙Zz15 小时前
Maven依赖冲突
java·服务器·maven
swordbob15 小时前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
咖啡八杯15 小时前
GoF设计模式——享元模式
java·spring·设计模式·享元模式
十五喵源码网15 小时前
基于springboot2+vue2的租房管理系统
java·毕业设计·springboot·论文笔记