一、引入spring-kafka的maven依赖

<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.5.4.RELEASE</version>
</dependency>
方式一、创建springboot-web项目,自动引入(本文以此为例创建)
  1. 打开IDEA-File-New-Project,选择Spring Initializr初始化方式,Next,Next
  2. 选中Web中的Spring Web依赖,点击添加
  3. 选中Messaging中的Spring for Apache Kafka依赖,点击添加
  4. 创建项目
方式二、创建maven项目,手动引入
  1. 打开IDEA-File-New-Project,选择Maven初始化方式
  2. 添加如下依赖到pom.xml文件
  3. 经过创建启动类,构造Web环境后,剩余操作跟方式一类似。
    <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
</dependencies>

二、生产者demo代码

step1:application.properties配置文件中,只开producer的配置,将consumer的配置注释

server.port=8080

#kafka
spring.kafka.bootstrap-servers=0.0.0.0:9092 #kafka producer
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.acks=all
spring.kafka.producer.retries=0 #kafka consumer
#spring.kafka.consumer.group-id=group_id
#spring.kafka.consumer.enable-auto-commit=true
#spring.kafka.consumer.auto-commit-interval=5000
#spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
#spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer

step2:spring会自动加载这些配置,初始化生产者,其使用方式如下:

直接调用方式

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; /**
* kafka 生产者样例代码
* @author cavan
*/
@RestController
@RequestMapping("/kafka")
public class KafkaController {
private static final Logger LOGGER = LoggerFactory.getLogger(KafkaController.class); private static final String TOPIC = "topic-test"; @Autowired
private KafkaTemplate<String, String> kafkaTemplate; @PostMapping(value = "/publish")
public String sendMessageTokafkaTopic(@RequestParam("message") String message) {
LOGGER.info(String.format("------ Producing message ------ %s", message));
kafkaTemplate.send(TOPIC, message);
return "ok";
}
}

封装后调用

封装代码

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service; /**
* kafka producer
*
* @author cavan
*/
@Service
public class Producer {
private static final Logger LOGGER = LoggerFactory.getLogger(Producer.class); @Autowired
private KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String topic, String message) {
LOGGER.info(String.format("Producing message is: %s", message));
kafkaTemplate.send(topic, message);
}
}

调用代码

import com.example.demo.kafka.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; /**
* kafka send message
*
* @author cavan
*/
@RestController
@RequestMapping("/kafka")
public class KafkaController {
private static final Logger LOGGER = LoggerFactory.getLogger(KafkaController.class); private static final String TOPIC = "topic-test"; @Autowired
private Producer producer; @PostMapping(value = "/producer")
public String sendMessageTokafka(@RequestParam("message") String message) {
LOGGER.info(String.format("------ Producing message ------ %s", message));
producer.sendMessage(TOPIC, message);
return "ok";
}
}

postman调用接口测试

生产者日志:

2021-10-08 19:26:50.205  INFO 20836 --- [nio-8080-exec-2] c.e.demo.controller.KafkaController      : ------ Producing message ------ success

三、消费者demo代码

step1:application.properties配置文件中,增加consumer的配置

server.port=8080

#kafka
spring.kafka.bootstrap-servers=0.0.0.0:9092 #kafka producer
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.acks=all
spring.kafka.producer.retries=0 #kafka consumer
spring.kafka.consumer.group-id=group_id
spring.kafka.consumer.enable-auto-commit=true
spring.kafka.consumer.auto-commit-interval=5000
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer

step2:spring会自动加载这些配置,初始化消费者,其使用方式如下:

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service; /**
* kafka consumer demo
*
* @author cavan
*/
@Service
public class Consumer {
private static final Logger LOGGER = LoggerFactory.getLogger(Consumer.class); @KafkaListener(id = "test", topics = "topic-test")
public void listen(ConsumerRecord<?, ?> record) {
LOGGER.info(
"topic ={},partition={},offset={},customer={},value={}",
record.topic(),
record.partition(),
record.offset(),
record.key(),
record.value());
}
}

消费成功日志:

2021-10-08 19:55:23.004  INFO 11340 --- [nio-8080-exec-2] o.a.kafka.common.utils.AppInfoParser     : Kafka version: 2.7.1
2021-10-08 19:55:23.004  INFO 11340 --- [nio-8080-exec-2] o.a.kafka.common.utils.AppInfoParser     : Kafka commitId: 61dbce85d0d41457
2021-10-08 19:55:23.004  INFO 11340 --- [nio-8080-exec-2] o.a.kafka.common.utils.AppInfoParser     : Kafka startTimeMs: 1633694123004
2021-10-08 19:55:23.117  INFO 11340 --- [ad | producer-1] org.apache.kafka.clients.Metadata        : [Producer clientId=producer-1] Cluster ID: Lx7DFjG5SYuOLlJKtz2NCQ
2021-10-08 19:55:23.236  INFO 11340 --- [     test-0-C-1] com.example.demo.kafka.Consumer          : topic =topic-test,partition=0,offset=31,customer=null,value=success

SpringBoot系列(四)使用spring-kafka实现生产者消费者demo代码的更多相关文章

  1. Linux 进程间通信(包含一个经典的生产者消费者实例代码)

    前言:编写多进程程序时,有时不可避免的需要在多个进程之间传递数据,我们知道,进程的用户的地址空间是独立,父进程中对数据的修改并不会反映到子进程中,但内核是共享的,大多数进程间通信方式都是在内核中建立一 ...

  2. Java 学习笔记 使用并发包ReentrantLock简化生产者消费者模式代码

    说明 ReentrantLock是java官方的一个线程锁类,ReentarntLock实现了Lock的接口 我们只需要使用这个,就可以不用使用synchronized同步关键字以及对应的notify ...

  3. 生产者消费者demo

    using System; using System.Collections.Generic; using System.Threading; namespace 生产者消费者 { class Pro ...

  4. springboot系列四、配置模板引擎、配置热部署

    一.配置模板引擎 在之前所见到的信息显示发现都是以 Rest 风格进行显示,但是很明显在实际的开发之中,所有数据的显示最终都应该交由页面完成,但是这个页面并不是*.jsp 页面,而是普通的*.html ...

  5. SpringBoot系列四:SpringBoot开发(改变环境属性、读取资源文件、Bean 配置、模版渲染、profile 配置)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念 SpringBoot 开发深入 2.具体内容 在之前已经基本上了解了整个 SpringBoot 运行机制,但是也需要清 ...

  6. Spring系列(四):Spring AOP详解和实现方式(xml配置和注解配置)

    参考文章:http://www.cnblogs.com/hongwz/p/5764917.html 一.什么是AOP AOP(Aspect Oriented Programming),即面向切面编程, ...

  7. springboot系列四:springboot整合mybatis jsp

    一.用IDEA 创建maven项目 项目目录结构 1.添加pom jar依赖 <?xml version="1.0" encoding="UTF-8"?& ...

  8. 基于Kafka的生产者消费者消息处理本地调试

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/68174111冷血之心的博客) Kafka下载地址:http://d ...

  9. java kafka 生产者消费者demo

    一.修改kafka   server.porperties的ip是你本机的ip listeners=PLAINTEXT://192.168.111.130:9092 二.生产者的例子 import o ...

  10. [b0029] python 归纳 (十四)_队列Queue实现生产者消费者

    # -*- coding: UTF-8 -*- """ 多线程的生产者,消费者 使用队列Queue """ import Queue imp ...

随机推荐

  1. 【笔记】go语言--Map

    go语言--Map //基本结构,定义 m := map[string] string { "name" : "ccmouse",//这些是无序的,是hashm ...

  2. 教你如何进行Prometheus 分片自动缩放

    本文分享自华为云社区<使用 Prometheus-Operator 进行 Prometheus + Keda 分片自动缩放>,作者: Kubeservice@董江. 垂直缩放与水平缩放 P ...

  3. 剑指offer03(Java)-数组中重复的数字(简单)

    题目: 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任 ...

  4. 重磅发布 | Serverless 应用中心:Serverless 应用全生命周期管理平台

    ​简介:Serverless 应用中心,是阿里云 Serverless 应用全生命周期管理平台.通过 Serverless 应用中心,用户在部署应用之前无需进行额外的克隆.构建.打包和发布操作,即可快 ...

  5. KubeVela 1.1 发布,开启混合环境应用交付新里程碑

    ​简介: KubeVela 作为一个开箱即用.面向现代微服务架构的应用交付与管理平台,今天正式发布了 1.1 版本,以更加用户友好和完善的功能集,开启了"让混合环境应用交付更加简单高效&qu ...

  6. [Gse] 高效的Golang中文分析库推荐

    优点:用法简单,支持各种语言,基本满足需求. 缺点:默认分词字典文件有 8M 需测试使用速度. 我们可以直接封装一个简单的辅助方法来实现分词功能: // @author cnblogs.com/far ...

  7. 迁移 dotnet 6 提示必须将目标平台设置为 Windows 平台

    我在迁移一个古老的项目为 .NET 6 框架,但是 VS 提示 error NETSDK1136 如果使用 Windows 窗体或 WPF,或者引用使用 Windows 窗体或 WPF 的项目或包,则 ...

  8. Fiddler对安卓模拟器中的app抓包

    工具资源 Fiddler: https://www.telerik.com/download/fiddler Xposed Installer: https://repo.xposed.info/mo ...

  9. MDK在头文件中使用预编译器时,#ifdef 无效的问题

    问题:在头文件中使用预编译时,会出现无效的现象 在a.h文件中定义了宏AA_TEST,如下所示 #ifndef __A_H #define __A_H #define AA_TEST #endif 在 ...

  10. Python中强大的通用ORM框架:SQLAlchemy

    Python中强大的通用ORM框架:SQLAlchemy https://zhuanlan.zhihu.com/p/444930067