Learn RabbitMQ with SpringBoot
文章目录
- What is RabbitMQ?
- RabbitMQ Core concept
- RabbitMQ Architecture
- Install and setup RabbitMQ using Docker
- Explore RabbitMQ using management UI
- Create and setup Springboot3 project in intellij
- Springboot and RabbitMQ Basic Message
- Connection between Springboot and RabbitMQ
- Create core component
- Create RabbitMQProducer
- Create REST API to send message
- create RabbitMQConsumer
- Springboot and RabbitMQ Json Message
- Create Json object
- add config
- Produce json message
- Create API to send json object
- Consum json message
What is RabbitMQ?
RabbitMQ Core concept
RabbitMQ Architecture
Install and setup RabbitMQ using Docker
# notice: select 3.11.15-management, it will have web management web page
docker pull rabbitmq:3.11.15-management
docker run --rm -it -p 15672:15672 -p 5672:5672 rabbitmq:3.11.0
Explore RabbitMQ using management UI
when we first login, username is guest and password is guest. Then we do some common operations in the dashboard.
- create exchange

- create queue

- binding exchange with queue using routing key


After finish all the operations, we can test whether it is work here. So publish a message to exchange, if we can get message in queue, we can think it works.


Create and setup Springboot3 project in intellij
First, using spring initializr to quick create and bootstrap spring boot project.

Second, using intellij open the project.

Springboot and RabbitMQ Basic Message
Connection between Springboot and RabbitMQ
Springboot autoconfiguration for spring AMQP(RabbitMQ). We get a connection to our RabbitMQ broker on port 5672 using the default username and password of "guest".
Define these proprtties in a application.properties.
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
Create core component
- setup queue name, exchange name and routing key name in
application.properties.
spring.rabbitmq.queue_name=fan_queue
spring.rabbitmq.exchange_name=fan_exchange
spring.rabbitmq.routing_key=fan_routing_key
- write the java code to create queue, exchange and binding.
// file path: com/fan/springbootrabbitmq/config
package com.fan.springbootrabbitmq.config;import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {@Value("${spring.rabbitmq.queue_name}")private String queueName;@Value("${spring.rabbitmq.exchange_name}")private String exchangeName;@Value("${spring.rabbitmq.routing_key}")private String routingKey;// spring bean for rabbitmq queue@Beanpublic Queue queue() {return new Queue(queueName);}// spring bean for rabbitmq exchange@Beanpublic TopicExchange exchange() {return new TopicExchange(exchangeName);}// binding between queue and exchange using routing key@Beanpublic Binding binding() {return BindingBuilder.bind(queue()).to(exchange()).with(routingKey);}
}
- rerun the project and check whether there are error, if no error, it works.
Create RabbitMQProducer
// file path: com/fan/springbootrabbitmq/publisher/RabbitMQProducer.java
package com.fan.springbootrabbitmq.publisher;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;@Service
public class RabbitMQProducer {@Value("${spring.rabbitmq.exchange_name}")private String exchangeName;@Value("${spring.rabbitmq.routing_key}")private String routingKey;// use RabbitTemplate to send the messages. it auto config for us, we just need to inject and use it.private final RabbitTemplate rabbitTemplate;private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQProducer.class);public RabbitMQProducer(RabbitTemplate rabbitTemplate) {this.rabbitTemplate = rabbitTemplate;}public void sendMessage(String message) {LOGGER.info(String.format("Message sent => %s", message));rabbitTemplate.convertAndSend(exchangeName, routingKey, message);}
}
Create REST API to send message
// file path: com/fan/springbootrabbitmq/controller/RabbitMQController.java
package com.fan.springbootrabbitmq.controller;import com.fan.springbootrabbitmq.publisher.RabbitMQProducer;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api/v1")
public class RabbitMQController {private RabbitMQProducer producer;public RabbitMQController(RabbitMQProducer producer) {this.producer = producer;}@GetMapping("/publish")public ResponseEntity<String> publish(@RequestParam("message") String message) {producer.sendMessage(message);return ResponseEntity.ok("Message sent to rabbitmq...");}
}
how to test?
- send api request to send message to rabbitmq:
http://localhost:8080/api/v1/publish?message=xxx - check in the dashboard:
http://localhost:15672/
create RabbitMQConsumer
// file path: com/fan/springbootrabbitmq/publisher/RabbitMQConsumer.java
package com.fan.springbootrabbitmq.publisher;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;@Service
public class RabbitMQConsumer {private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQProducer.class);@RabbitListener(queues = "${spring.rabbitmq.queue_name}")public void consum(String message) {LOGGER.info(String.format("Message received => %s", message));}}
after finish this part, rerun the project and send a request for sending message to rabbitmq, and then you can see the result in peoject like this:
[ntContainer#0-1] c.f.s.publisher.RabbitMQProducer : Message sent => hello1
[ntContainer#0-1] c.f.s.publisher.RabbitMQProducer : Message received => hello1
Springboot and RabbitMQ Json Message
Create Json object
// file path: com/fan/springbootrabbitmq/dto/User.java
package com.fan.springbootrabbitmq.dto;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Long id;private String firstName;private String lastName;
}
add config
// file path: com/fan/springbootrabbitmq/config/RabbitMQConfig.java// add this attributes to RabbitMQConfig class@Value("${spring.rabbitmq.json.queue_name}")private String queueJsonName;@Value("${spring.rabbitmq.json.routing_key}")private String routingJsonKey;// add this methods to RabbitMQConfig class@Beanpublic Queue jsonQueue() {return new Queue(queueJsonName);}@Beanpublic MessageConverter converter(){return new Jackson2JsonMessageConverter();}@Beanpublic AmqpTemplate amqpTemplate(ConnectionFactory connectionFactory){RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);rabbitTemplate.setMessageConverter(converter());return rabbitTemplate;}@Beanpublic Binding jsonBinding() {return BindingBuilder.bind(jsonQueue()).to(exchange()).with(routingJsonKey);}
Produce json message
// file path: com/fan/springbootrabbitmq/publisher/RabbitMQJsonProducer.java
package com.fan.springbootrabbitmq.publisher;import com.fan.springbootrabbitmq.dto.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;@Service
public class RabbitMQJsonProducer {@Value("${spring.rabbitmq.exchange_name}")private String exchangeName;@Value("${spring.rabbitmq.routing_key}")private String routingKey;// use RabbitTemplate to send the messages. it auto config for us, we just need to inject and use it.private final RabbitTemplate rabbitTemplate;private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQJsonProducer.class);public RabbitMQJsonProducer(RabbitTemplate rabbitTemplate) {this.rabbitTemplate = rabbitTemplate;}public void sendJsonMessage(User user) {LOGGER.info(String.format("Message sent => %s", user.toString()));rabbitTemplate.convertAndSend(exchangeName, routingKey, user);}
}
Create API to send json object
// file path: com/fan/springbootrabbitmq/publisher/RabbitMQJsonProducer.java
package com.fan.springbootrabbitmq.publisher;import com.fan.springbootrabbitmq.dto.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;@Service
public class RabbitMQJsonProducer {@Value("${spring.rabbitmq.exchange_name}")private String exchangeName;@Value("${spring.rabbitmq.json.routing_key}")private String routingJsonKey;// use RabbitTemplate to send the messages. it auto config for us, we just need to inject and use it.private final RabbitTemplate rabbitTemplate;private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQJsonProducer.class);public RabbitMQJsonProducer(RabbitTemplate rabbitTemplate) {this.rabbitTemplate = rabbitTemplate;}public void sendJsonMessage(User user) {LOGGER.info(String.format("Message sent => %s", user.toString()));rabbitTemplate.convertAndSend(exchangeName, routingJsonKey, user);}
}
Consum json message
file path: com/fan/springbootrabbitmq/publisher/RabbitMQJsonConsumer.java
package com.fan.springbootrabbitmq.publisher;import com.fan.springbootrabbitmq.dto.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;@Service
public class RabbitMQJsonConsumer {private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQProducer.class);@RabbitListener(queues = "${spring.rabbitmq.json.queue_name}")public void consum(User user) {LOGGER.info(String.format("Message received => %s", user.toString()));}}
相关文章:
Learn RabbitMQ with SpringBoot
文章目录 What is RabbitMQ?RabbitMQ Core conceptRabbitMQ ArchitectureInstall and setup RabbitMQ using DockerExplore RabbitMQ using management UICreate and setup Springboot3 project in intellijSpringboot and RabbitMQ Basic MessageConnection between Springbo…...
定时器 POSIX Timer定时器和setitimer定时器
POSIX 可移植 POSIX:可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX 。 POSIX Timer C API 总结POSIX系统的C标准库: 函数描述clock_settime()通过指定Value设置clock的分辨率clock_gettime()…...
DeSD:用于3D医学图像分割的深度自蒸馏自监督学习
文章目录 DeSD: Self-Supervised Learning with Deep Self-Distillation for 3D Medical Image Segmentation摘要本文方法Deep Self-DistillationDownstream Transfer Learning 实验结果 DeSD: Self-Supervised Learning with Deep Self-Distillation for 3D Medical Image Seg…...
MySQL数据库——MySQL创建触发器(CREATE TRIGGER)
触发器是与 MySQL 数据表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。 基本语法 在 MySQL 5.7 中,可以使用 CREATE TRIGGER 语句创建触发器。 语法格…...
Java实现网上人才招聘系统【附源码】
网上人才招聘系统 1、概述 3 2、系统分析 4 2.1、问题定义 4 2.2、可行性研究 4 2.2.1、可行性需求分析 4 2.2.2、数据流分析 5 2.2.3、数据字典 6 2.2.4、程序流程图 6 2.2.4、开发进度计划 6 2.3、需求分析 7 2.3.1、功能需求分析 7 2.3.2、数据需求分析 10 2.3.3、性能需求…...
jmeter接口测试项目实战详解,零基础也能学,源码框架都给你
目录 1.什么是jmeter? 2.jmeter能做什么? 3.jmeter环境搭建 3.1前提: 3.2jmeter下载: 3.3jmeter环境搭建: 3.3.1mac当中jmeter环境搭建: 3.4jmeter基本配置 3.4.1.切换语言 3.4.2.安装插件 4.jmet…...
MySQL中去重 distinct 和 group by 是如何去重的
1:测试数据 CREATE TABLE student (stu_no VARCHAR(40) NOT NULL,name VARCHAR(100) NOT NULL );insert into student values(1,name1); insert into student values(2,name2); insert into student values(3,name1); insert into student values(4,name2); i…...
在职读研是理想还是情怀?你想要的都将在社科大能源管理硕士项目实现
在职读研是理想还是情怀呢,每个读研人的想法不同,原因也有所不同。但选择在职继续攻读硕士学位的群体也有着共同点,他们都是想拥有高学历,拥有高目标的一群人。探寻新的起点和终点是他们想所要追求的。不管读研的初心是什么&#…...
携手共建数字钢铁,Hightopo亮相第三届钢铁展洽会
4 月 26 日备受期待的第三届钢铁展洽会在日照盛大召开。图扑软件作为智慧钢铁行业领先的 2D 和 3D 图形界面可视化解决方案提供商,受邀参与此次展会。 图扑软件携智慧钢铁三维可视化监控体系亮相“钢铁展洽会”,向众多钢铁企业展示了一系列图扑 HT 数字…...
Leetcode2383. 赢得比赛需要的最少训练时长
Every day a Leetcode 题目来源:2383. 赢得比赛需要的最少训练时长 解法1:模拟 可以分开考虑在比赛开始前,需要最少增加的精力和经验数量。 每次遇到一个对手,当前精力值都需要严格大于当前对手,否则需要增加精力值…...
js代码执行过程、调用栈、执行上下文
参考资料 极客时间课程《浏览器工作原理与实践》 – 李兵 一、js代码执行过程 (一)javascript代码的执行流程 浏览器执行javascript代码的流程如下图所示: javascript的执行机制是:先编译,再执行。在编译阶段生成了…...
互联网摸鱼日报(2023-05-12)
互联网摸鱼日报(2023-05-12) InfoQ 热门话题 建设和改进持续业务交付能力| BizDevOps 公开课 一部手机就可运行,精通Python等20种语言!谷歌终于能与OpenAI 打擂台了,全新PaLM 2比肩GPT-4 蚂蚁数科开发者…...
【Python从入门到实践3.1】扑克发牌知识点(range函数,def函数,else语句配合使用,random库,列表推导式)
扑克发牌知识点 range函数def函数else语句配合使用:random库列表推导式 本篇博文需要特别感谢"Python从入门到精通"课程中一位同学对扑克发牌程序做出的知识点分析,本博文的内容大多也是从这位同学的分析而来. range函数 Range()函数: *返回一…...
Spring Cloud第二季--Spring Cloud Bus
文章目录 Spring Clud Bus什么是总线基本原理 牛刀小试 Spring Clud Bus 在Spring Cloud学习–配置中心(Config)中实现了集中管理微服务配置、不同环境不同配置、运行期间也可动态调整、配置修改后可以自动更新的需求,但同时也有一个弊端&am…...
Unittest自动化测试之unittestunittest_生成测试报告
unittest_生成测试报告 测试报告为测试结果的统计即展示,是自动化测试不可或缺的一部分,利用unittest 可以生成测试报告 方式一、使用第三方 HTMLTestRunner 执行测试用例集,生成网页版测试报告(推荐) HTMLTestRunn…...
一个查询IP地理信息和CDN提供商的离线终端工具
Nali 功能 支持多种数据库 纯真 IPv4 离线数据库ZX IPv6 离线数据库Geoip2 城市数据库 (可选)IPIP 数据库 (可选)ip2region 数据库 (可选)DB-IP 数据库 (可选)IP2Location DB3 LITE 数据库 (可选) CDN 服务提供商查询支持管道处理支持交互式查询同时支持IPv4和IPv6支持多语言…...
RflySim平台使用篇 | Rflysim3D软件使用系列教程(二)
导读: RflySim3D(支持体验版)和RflySimUE5(支持完整版)为本平台核心三维显示软件, 分别基于UE4 和UE5 引擎开发,具备高逼真虚拟现实显示效果。本视频主要讲解了如何将自定义的三维场景如何加载到RflySim3D…...
2023 年第五届河南省 CCPC 大学生程序设计竞赛
题目地址 题目PDF地址 题解地址 Problem A. 小水獭游河南 ∣ a ∣ ≤ ∣ Σ ∣ 26 ,暴力枚举 a 判断 b 是否为是回文串即可,时间复杂度 O ( ∣ Σ ∣ ∣ s ∣ ) 。 |a| ≤ |Σ| 26,暴力枚举 a 判断 b 是否为是回文串即可,时间…...
nginx liunx最新版本安装flask部署
一、nginx安装 1.进入Nginx官网的资源下载页:http://nginx.org/en/download.html 2.下载nginx-1.22.1.tar.gz, 3解压: tar -zxvf nginx-1.22.1.tar.gz解压完成后会在当前目录下得到一个新的nginx文件夹 4.终端进入nginx文件夹目录&#x…...
热图 -- pheatmap or ggplot2
文章目录 brief数据准备 pheatmap实例最朴素的方式数据缩放取消聚类更改每个小方格的大小聚类以及聚类方式和参数修改热图呈现的颜色修改legend ggplot2实例ggplot2实例变式添加 group bar做成dotplot pheatmap 多图组合问题 brief 这里主要记录了pheatmap 以及 ggplot2实现热…...
RISC-V特权架构探秘:从模式切换看系统安全与效率
1. RISC-V特权架构的核心价值 第一次接触RISC-V特权架构时,很多人会疑惑:为什么需要设计这么多层特权模式?这就像城市交通管理中的红绿灯系统——如果没有分层权限控制,所有程序都能随意访问硬件资源,就像所有车辆都能…...
如何用观察者模式打造惊艳的iPhone 15 Pro滚动动画效果:从零开始的前端设计模式实践
如何用观察者模式打造惊艳的iPhone 15 Pro滚动动画效果:从零开始的前端设计模式实践 【免费下载链接】iphone Recreate the Apple iPhone 15 Pro website, combining GSAP animations and Three.js 3D effects. From custom animations to animated 3D models, this…...
Meta计划5月裁员约10%,约8000人受影响,此前AI领域投资巨大
Meta新一轮裁员:约8000人将告别据彭博社公布的Meta首席人力官珍妮尔盖尔(Janelle Gale)的备忘录显示,Meta计划在5月裁员约10%,这意味着约8000人将被裁。同时,盖尔还表示,Meta还将关闭约6000个招…...
MOD17A2H V6 GPP数据质量(Psn_QC)波段详解:如何正确解读与过滤不可靠的植被生产力数据
MOD17A2H V6 GPP数据质量(Psn_QC)波段详解:如何正确解读与过滤不可靠的植被生产力数据 植被生产力数据在生态研究、碳循环模拟和气候变化监测中扮演着关键角色。作为全球应用最广泛的GPP产品之一,MOD17A2H V6数据集虽然提供了宝贵…...
序列到序列预测:Encoder-Decoder架构与Keras实现
1. 理解序列到序列预测的挑战在传统的序列预测问题中,我们通常处理的是"一对一"或"多对一"的映射关系。比如预测股票价格(多个历史数据点预测一个未来值)或情感分析(一个句子预测一个情感标签)。但…...
DLSS Swapper完全指南:终极游戏性能优化神器
DLSS Swapper完全指南:终极游戏性能优化神器 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专业的DLSS版本管理工具,让普通玩家也能轻松切换游戏中的DLSS动态链接库文件&…...
茉莉花插件终极指南:3步彻底解决中文文献管理难题
茉莉花插件终极指南:3步彻底解决中文文献管理难题 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 茉莉花(…...
抖音批量下载器:三步搞定无水印视频批量下载
抖音批量下载器:三步搞定无水印视频批量下载 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批…...
2026届最火的六大AI学术助手推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 可被知网 AIGC 检测系统识别的,是学术文本里由生成式人工智能撰写的内容…...
DataPrep与Pandas对比:为什么选择低代码数据准备
DataPrep与Pandas对比:为什么选择低代码数据准备 【免费下载链接】dataprep Open-source low code data preparation library in python. Collect, clean and visualization your data in python with a few lines of code. 项目地址: https://gitcode.com/gh_mir…...
