当前位置: 首页 > news >正文

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&#xff1a;可移植操作系统接口&#xff08;Portable Operating System Interface of UNIX&#xff0c;缩写为 POSIX 。 POSIX Timer C API 总结POSIX系统的C标准库&#xff1a; 函数描述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 数据表有关的数据库对象&#xff0c;在满足定义条件时触发&#xff0c;并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。 基本语法 在 MySQL 5.7 中&#xff0c;可以使用 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&#xff1f; 2.jmeter能做什么&#xff1f; 3.jmeter环境搭建 3.1前提&#xff1a; 3.2jmeter下载&#xff1a; 3.3jmeter环境搭建&#xff1a; 3.3.1mac当中jmeter环境搭建&#xff1a; 3.4jmeter基本配置 3.4.1.切换语言 3.4.2.安装插件 4.jmet…...

MySQL中去重 distinct 和 group by 是如何去重的

1&#xff1a;测试数据 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…...

在职读研是理想还是情怀?你想要的都将在社科大能源管理硕士项目实现

在职读研是理想还是情怀呢&#xff0c;每个读研人的想法不同&#xff0c;原因也有所不同。但选择在职继续攻读硕士学位的群体也有着共同点&#xff0c;他们都是想拥有高学历&#xff0c;拥有高目标的一群人。探寻新的起点和终点是他们想所要追求的。不管读研的初心是什么&#…...

携手共建数字钢铁,Hightopo亮相第三届钢铁展洽会

4 月 26 日备受期待的第三届钢铁展洽会在日照盛大召开。图扑软件作为智慧钢铁行业领先的 2D 和 3D 图形界面可视化解决方案提供商&#xff0c;受邀参与此次展会。 图扑软件携智慧钢铁三维可视化监控体系亮相“钢铁展洽会”&#xff0c;向众多钢铁企业展示了一系列图扑 HT 数字…...

Leetcode2383. 赢得比赛需要的最少训练时长

Every day a Leetcode 题目来源&#xff1a;2383. 赢得比赛需要的最少训练时长 解法1&#xff1a;模拟 可以分开考虑在比赛开始前&#xff0c;需要最少增加的精力和经验数量。 每次遇到一个对手&#xff0c;当前精力值都需要严格大于当前对手&#xff0c;否则需要增加精力值…...

js代码执行过程、调用栈、执行上下文

参考资料 极客时间课程《浏览器工作原理与实践》 – 李兵 一、js代码执行过程 &#xff08;一&#xff09;javascript代码的执行流程 浏览器执行javascript代码的流程如下图所示&#xff1a; javascript的执行机制是&#xff1a;先编译&#xff0c;再执行。在编译阶段生成了…...

互联网摸鱼日报(2023-05-12)

互联网摸鱼日报&#xff08;2023-05-12&#xff09; InfoQ 热门话题 建设和改进持续业务交付能力&#xff5c; BizDevOps 公开课 一部手机就可运行&#xff0c;精通Python等20种语言&#xff01;谷歌终于能与OpenAI 打擂台了&#xff0c;全新PaLM 2比肩GPT-4 蚂蚁数科开发者…...

【Python从入门到实践3.1】扑克发牌知识点(range函数,def函数,else语句配合使用,random库,列表推导式)

扑克发牌知识点 range函数def函数else语句配合使用&#xff1a;random库列表推导式 本篇博文需要特别感谢"Python从入门到精通"课程中一位同学对扑克发牌程序做出的知识点分析,本博文的内容大多也是从这位同学的分析而来. range函数 Range()函数&#xff1a; *返回一…...

Spring Cloud第二季--Spring Cloud Bus

文章目录 Spring Clud Bus什么是总线基本原理 牛刀小试 Spring Clud Bus 在Spring Cloud学习–配置中心&#xff08;Config&#xff09;中实现了集中管理微服务配置、不同环境不同配置、运行期间也可动态调整、配置修改后可以自动更新的需求&#xff0c;但同时也有一个弊端&am…...

Unittest自动化测试之unittestunittest_生成测试报告

unittest_生成测试报告 测试报告为测试结果的统计即展示&#xff0c;是自动化测试不可或缺的一部分&#xff0c;利用unittest 可以生成测试报告 方式一、使用第三方 HTMLTestRunner 执行测试用例集&#xff0c;生成网页版测试报告&#xff08;推荐&#xff09; HTMLTestRunn…...

一个查询IP地理信息和CDN提供商的离线终端工具

Nali 功能 支持多种数据库 纯真 IPv4 离线数据库ZX IPv6 离线数据库Geoip2 城市数据库 (可选)IPIP 数据库 (可选)ip2region 数据库 (可选)DB-IP 数据库 (可选)IP2Location DB3 LITE 数据库 (可选) CDN 服务提供商查询支持管道处理支持交互式查询同时支持IPv4和IPv6支持多语言…...

RflySim平台使用篇 | Rflysim3D软件使用系列教程(二)

导读: RflySim3D&#xff08;支持体验版&#xff09;和RflySimUE5&#xff08;支持完整版&#xff09;为本平台核心三维显示软件&#xff0c; 分别基于UE4 和UE5 引擎开发&#xff0c;具备高逼真虚拟现实显示效果。本视频主要讲解了如何将自定义的三维场景如何加载到RflySim3D…...

2023 年第五届河南省 CCPC 大学生程序设计竞赛

题目地址 题目PDF地址 题解地址 Problem A. 小水獭游河南 ∣ a ∣ ≤ ∣ Σ ∣ 26 &#xff0c;暴力枚举 a 判断 b 是否为是回文串即可&#xff0c;时间复杂度 O ( ∣ Σ ∣ ∣ s ∣ ) 。 |a| ≤ |Σ| 26&#xff0c;暴力枚举 a 判断 b 是否为是回文串即可&#xff0c;时间…...

nginx liunx最新版本安装flask部署

一、nginx安装 1.进入Nginx官网的资源下载页&#xff1a;http://nginx.org/en/download.html 2.下载nginx-1.22.1.tar.gz&#xff0c; 3解压&#xff1a; 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实现热…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...