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 ...
随机推荐
- 对接HiveMetaStore,拥抱开源大数据
本文分享自华为云社区<对接HiveMetaStore,拥抱开源大数据>,作者:睡觉是大事. 1. 前言 适用版本:9.1.0及以上 在大数据融合分析时代,面对海量的数据以及各种复杂的查询, ...
- Spring Cloud Gateway一次请求调用源码解析
简介: 最近通过深入学习Spring Cloud Gateway发现这个框架的架构设计非常简单.有效,很多组件的设计都非常值得学习,本文就Spring Cloud Gateway做一个简单的介绍,以及 ...
- Flink 1.12 资源管理新特性回顾
简介: 介绍 Flink 1.12 资源管理的一些特性,包括内存管理.资源调度.扩展资源框架. 本文由社区志愿者陈政羽整理,Apache Flink Committer.阿里巴巴技术专家宋辛童,Apa ...
- 阿里云日志服务SLS,打造云原生时代智能运维
2021年10月21日,阿里云针对企业运维难题,在云栖大会为大家带来了一场<智能运维论坛>的主题演讲.在会上,阿里云资深技术专家.日志服务技术负责人简志提出"云原生时代,企业业 ...
- [Trading] 人物: 陈向忠日内交易技术核心 - 趋势形态与成交量
分时图判断趋势(开仓方向) 只要是低点不断抬高的,就是上涨趋势,高点是否提高是其次的. 只要是高点不断降低的那就是下降趋势,假如低点也在不断降低,那么这样的下降趋势就更加完美一些. 很多人就是看对了趋 ...
- Roslyn 将构建时间写入到输出文件
我期望在每次构建完成之后,创建一个文件,在这个文件里面写入是什么时间构建的.这个需求实现非常简单,只需要使用 Target 在构建完成,使用 WriteLinesToFile 方法写入时间到输出文件即 ...
- dotnetCampus.UITest.WPF 一个支持中文用例的界面单元测试框架
本文来安利大家一个支持使用中文做用例名的 WPF 界面 UI 单元测试框架 卖点 有没有觉得命名太难?有没有觉得单元测试的命名更难?没错,这是一个业界的大问题.很多团队都会因为单元测试的用例函数命名太 ...
- Unlink原理和一些手法
Unlink原理和一些手法 简单介绍一下unlink相关的知识 unlink是利用glibc malloc 的内存回收机制造成攻击的,核心就在于当两个free的堆块在物理上相邻时,会将他们合并,并将原 ...
- ES_CCS/R(三):跨集群复制 Cross-cluster replication(CCR)
跨集群复制(CCR)功能支持将远程集群中的索引复制到本地集群. 可以在一些常见的生产用例中使用此功能: 灾难恢复(DR)/高可用性(HA):如果主群集发生故障,则进行灾难恢复. 辅助群集可以用作热备份 ...
- 21°C的冬天
2023-12-08 16:15:36 星期五 标题没有在胡说,今天穿着初秋的衣服还嫌热,尤其是蒋震图书馆的空调更是燥热. 明天就去考教资面试了,但是一点也没有学习的兴趣,今天下午四点就写完了这周所有 ...