SpringBoot系列(四)使用spring-kafka实现生产者消费者demo代码
一、引入spring-kafka的maven依赖
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.5.4.RELEASE</version>
</dependency>
方式一、创建springboot-web项目,自动引入(本文以此为例创建)
- 打开IDEA-File-New-Project,选择Spring Initializr初始化方式,Next,Next
- 选中Web中的Spring Web依赖,点击添加
- 选中Messaging中的Spring for Apache Kafka依赖,点击添加
- 创建项目
方式二、创建maven项目,手动引入
- 打开IDEA-File-New-Project,选择Maven初始化方式
- 添加如下依赖到pom.xml文件
- 经过创建启动类,构造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代码的更多相关文章
- Linux 进程间通信(包含一个经典的生产者消费者实例代码)
前言:编写多进程程序时,有时不可避免的需要在多个进程之间传递数据,我们知道,进程的用户的地址空间是独立,父进程中对数据的修改并不会反映到子进程中,但内核是共享的,大多数进程间通信方式都是在内核中建立一 ...
- Java 学习笔记 使用并发包ReentrantLock简化生产者消费者模式代码
说明 ReentrantLock是java官方的一个线程锁类,ReentarntLock实现了Lock的接口 我们只需要使用这个,就可以不用使用synchronized同步关键字以及对应的notify ...
- 生产者消费者demo
using System; using System.Collections.Generic; using System.Threading; namespace 生产者消费者 { class Pro ...
- springboot系列四、配置模板引擎、配置热部署
一.配置模板引擎 在之前所见到的信息显示发现都是以 Rest 风格进行显示,但是很明显在实际的开发之中,所有数据的显示最终都应该交由页面完成,但是这个页面并不是*.jsp 页面,而是普通的*.html ...
- SpringBoot系列四:SpringBoot开发(改变环境属性、读取资源文件、Bean 配置、模版渲染、profile 配置)
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念 SpringBoot 开发深入 2.具体内容 在之前已经基本上了解了整个 SpringBoot 运行机制,但是也需要清 ...
- Spring系列(四):Spring AOP详解和实现方式(xml配置和注解配置)
参考文章:http://www.cnblogs.com/hongwz/p/5764917.html 一.什么是AOP AOP(Aspect Oriented Programming),即面向切面编程, ...
- springboot系列四:springboot整合mybatis jsp
一.用IDEA 创建maven项目 项目目录结构 1.添加pom jar依赖 <?xml version="1.0" encoding="UTF-8"?& ...
- 基于Kafka的生产者消费者消息处理本地调试
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/68174111冷血之心的博客) Kafka下载地址:http://d ...
- java kafka 生产者消费者demo
一.修改kafka server.porperties的ip是你本机的ip listeners=PLAINTEXT://192.168.111.130:9092 二.生产者的例子 import o ...
- [b0029] python 归纳 (十四)_队列Queue实现生产者消费者
# -*- coding: UTF-8 -*- """ 多线程的生产者,消费者 使用队列Queue """ import Queue imp ...
随机推荐
- 力扣69(java&python)-x的平方根(简单)
题目: 给你一个非负整数 x ,计算并返回 x 的 算术平方根 . 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 . 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0. ...
- 力扣306(java)-累加数(中等)
题目: 累加数 是一个字符串,组成它的数字可以形成累加序列. 一个有效的 累加序列 必须 至少 包含 3 个数.除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和. 给你一个只包含数 ...
- EventBridge 与 FC 一站式深度集成解析
简介:本篇文章通过对 EventBridge 与 FC 一站式深度集成解析和集成场景的介绍,旨在帮助大家更好的了解面对丰富的事件时,如何使用 EventBridge 与 FC 的一站式集成方案,快速 ...
- Raft 共识算法1-Raft基础
Raft 共识算法1-Raft基础 Raft算法中译版地址:http://www.redisant.cn/etcd/contact 英原论文地址:https://raft.github.io/raft ...
- ESP32 + IDF + LED
一.开发板 ESP32-S3-DevKitC-1 管脚布局 由于这个程序控制比较简单,就不赘述了,直接看程序. 二.程序 #include "freertos/FreeRTOS.h" ...
- STM32F10x 串口使用DMA
一.DMA简介 DMA(Direct Memory Access,直接存储器访问) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载.否则,CPU 需要 ...
- protobuf 文档
文档地址: https://golang-tech-stack.com/tutorial/pb 学习视频: https://www.bilibili.com/video/BV1Y3411j7EM?p= ...
- LogAgen的工作流程
LogAgen的工作流程: 一.读日志 --tailf 第三方库 新建tail_test/main.go package main import ( "fmt" "git ...
- HJ212-2017协议数据采集和接收
1.客户端TCP和UDP的数据发送工具 工具和软件下载页面如下:http://www.zlmcu.com/document/tcp_debug_tools.html 2.服务端数据接收监控软件 IPA ...
- 避免Java异常栈被吞掉
The compiler in the server VM now provides correct stack backtraces for all "cold" built-i ...