zoukankan      html  css  js  c++  java
  • SpringBoot整合SpringKafka实现生产者史上最简代码实现

    项目源码:https://github.com/xuebus/springkafkaproducer

    这是生产者端的代码,消费者请参考另一篇博客:

    https://www.cnblogs.com/jun1019/p/7895830.html

    该项目是使用的技术:SpringBoot  + SpringKafka + Maven

    先看pom.xml文件中引入的依赖:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     4     <modelVersion>4.0.0</modelVersion>
     5 
     6     <groupId>com.xuebusi.producer</groupId>
     7     <artifactId>producer</artifactId>
     8     <version>0.0.1-SNAPSHOT</version>
     9     <packaging>jar</packaging>
    10 
    11     <name>springkafkaproducer</name>
    12     <description>Demo project for Spring Boot</description>
    13 
    14     <parent>
    15         <groupId>org.springframework.boot</groupId>
    16         <artifactId>spring-boot-starter-parent</artifactId>
    17         <version>1.5.8.RELEASE</version>
    18         <relativePath/> <!-- lookup parent from repository -->
    19     </parent>
    20 
    21     <properties>
    22         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    23         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    24         <java.version>1.8</java.version>
    25     </properties>
    26 
    27     <dependencies>
    28         <dependency>
    29             <groupId>org.springframework.boot</groupId>
    30             <artifactId>spring-boot-starter-freemarker</artifactId>
    31         </dependency>
    32         <dependency>
    33             <groupId>org.springframework.kafka</groupId>
    34             <artifactId>spring-kafka</artifactId>
    35             <version>1.0.6.RELEASE</version>
    36         </dependency>
    37         <dependency>
    38             <groupId>org.springframework.boot</groupId>
    39             <artifactId>spring-boot-starter-web</artifactId>
    40         </dependency>
    41 
    42         <dependency>
    43             <groupId>org.springframework.boot</groupId>
    44             <artifactId>spring-boot-starter-test</artifactId>
    45             <scope>test</scope>
    46         </dependency>
    47     </dependencies>
    48 
    49     <build>
    50         <plugins>
    51             <plugin>
    52                 <groupId>org.springframework.boot</groupId>
    53                 <artifactId>spring-boot-maven-plugin</artifactId>
    54             </plugin>
    55         </plugins>
    56     </build>
    57 
    58 
    59 </project>

    注意:这里我使用的spring-kafka(它包装了apache的kafka-client)的依赖包版本是 1.0.6.RELEASE, 是因为我Linux服务器上部署的kafka服务器的版本是kafka_2.10-0.9.0.1,使用的kafka的时候要注意,kafka客户端(kafka-client)的版本要和kafka服务器的版本一一对应,否则,消息发送会失败。

    Spring官方网站上给出了SpringKafka和kafka-client版本(它的版本号要和kafka服务器的版本保持一致)的对应关系:

    https://projects.spring.io/spring-kafka/

    下面是生产者的配置文件,既然使用的是SpringBoot,配置文件就是 application.yml

    server:
      port: 8081
    spring:
      kafka:
        producer:
          bootstrap-servers: 192.168.71.11:9092,192.168.71.12:9092,192.168.71.13:9092

    在上面的配置中,我们给生产者分配的端口号是8081,服务器有3台,分别对应3个ip地址和端口。
    该配置只是配置了kafka服务器的ip地址,这里并没有对生产者做过多的配置。想了解关于kafka生产者相关的更多配置的话,可以自行查阅相关资料进行学习。

    下面是kafka生产者的核心代码,实现了消息的发送逻辑:

    package com.xuebusi.producer;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.kafka.core.KafkaTemplate;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    import org.springframework.util.concurrent.ListenableFuture;
    
    import java.util.UUID;
    
    /**
     * 生产者
     * 使用@EnableScheduling注解开启定时任务
     */
    @Component
    @EnableScheduling
    public class KafkaProducer {
    
        @Autowired
        private KafkaTemplate kafkaTemplate;
    
        /**
         * 定时任务
         */
        @Scheduled(cron = "00/1 * * * * ?")
        public void send(){
            String message = UUID.randomUUID().toString();
            ListenableFuture future = kafkaTemplate.send("app_log", message);
            future.addCallback(o -> System.out.println("send-消息发送成功:" + message), throwable -> System.out.println("消息发送失败:" + message));
        }
    
    }

    在上面的代码中,负责发送消息的角色就是SpringKafka提供的 KafkaTemplate对象,使用它的 send()方法就可以把自己的消息发送到kafka服务器。send()方法有多个重载的方法,大家可以根据自己的需要来使用不同的send()方法。

    这里我们为了方便发送消息进行测试,使用了Spring的定时任务,在类上使用 @EnableScheduling 注解开启定时任务,在方法上使用@Scheduled注解并指定表达式来定义定时规则,这里我们每秒就会向kafka服务器发送一条消息。

    当然,你可能不会用到Spring的定时任务,你可以把@EnableScheduling  和 @Scheduled注解去掉。你也可以通过使用Spring的@Controller和@RequestMapping 注解将你的发送消息的方法定义成一个接口。

    你可以定义多个不同的方法,每个使用到了 KafkaTemplate 对象的方法都会是一个生产者。

    下面就启动SpringBoot项目测试:

    package com.xuebusi;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class SpringkafkaproducerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringkafkaproducerApplication.class, args);
        }
    }

    使用鼠标右键运行main方法即可启动SpringBoot项目,在控制台你会看到成功连接到kafka服务器,并每隔1秒就会发送一条消息到kafka服务器。

  • 相关阅读:
    【Git】Git 学习笔记(一)
    【工程 Shell】Shell 学习(一)
    Vue 使用 Antd 简单实现左侧菜单栏和面包屑功能
    GoF的23种设计模式的功能
    ASP 对数据库的操作
    注册表修改USB状态(开与关)
    EXE文件关联修复
    CentOS8安装Docker
    GoogleEarth无法连接服务器解决方法
    【转】Qt 实现的拷贝 文件/文件夹 的函数
  • 原文地址:https://www.cnblogs.com/jun1019/p/7895746.html
Copyright © 2011-2022 走看看