Spring Boot 项目应用消息服务器RabbitMQ(简单介绍)
一、背景
本章讲述的是在用户下单环节,消息服务器RabbitMQ 的应用
1.1 消息服务器的应用
在写一个电商项目的小demo,在电商项目中,消息服务器的应用:
1、订单状态通知:当用户下单、支付成功、订单发货、订单完成等关键节点时,可以通过消息服务器向用户发送相应的订单状态通知。
2、消息推送:通过消息服务器,可以向用户推送个性化的推荐商品、促销活动等消息,以提高用户参与度和购买率。
3、异步处理:在一些涉及到耗时操作的场景中,比如库存扣减、物流跟踪等,可以将任务交给消息服务器进行异步处理,以提高系统的并发性和响应速度。
4、实时聊天:如果你的电商系统支持在线客服或用户之间的实时沟通,消息服务器可以用于实现即时通讯功能。
5、消息队列:消息服务器还可以作为消息队列的承载者,实现系统内不同模块之间的解耦和异步通信。
消息服务器的选择可以考虑使用开源的消息队列中间件,比如RabbitMQ、Apache Kafka、ActiveMQ等,或者云服务提供商提供的消息队列服务,比如阿里云的消息队列RocketMQ、腾讯云的消息队列CMQ等。
需要注意的是,在使用消息服务器时,确保数据的安全性和可靠性,并合理设计消息的格式和传输方式,以确保系统的正常运行和用户体验。
1.2 下单这个环节,消息服务器应用场景
用户下单这个环节,应用消息服务器有以下几个常见的应用场景:
1、异步处理订单:当用户下单后,可以将订单信息发送到消息服务器中,由消息服务器异步处理。这样可以减少用户等待时间,并提高系统的并发能力。消息服务器可以负责处理订单的各种业务逻辑,比如库存扣减、生成物流单号等操作。
2、订单状态通知:在用户下单后,可以通过消息服务器向用户发送订单状态的通知,比如订单已提交、支付成功、订单发货、订单完成等。消息服务器可以实时地将通知推送给用户,提供良好的用户体验。
3、订单状态跟踪:在整个订单生命周期中,消息服务器可以记录和跟踪订单的状态变化。当用户查询订单状态时,可以通过消息服务器获取最新的订单状态信息,确保订单状态的准确性和实时性。
4、消息队列:消息服务器可以作为消息队列的组件,对订单相关的消息进行队列化处理。这样可以解耦订单模块与其他模块之间的依赖关系,提高系统的稳定性和可扩展性。
二、RabbitMQ 的下载与安装
2.1 RabbitMQ的官网地址:
RabbitMQ的官网地址:
RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQ
2.2. 使用brew安装
1、安装
brew install rabbitmq
安装结果:

rabbitmq 的安装路径:
/opt/homebrew/opt/rabbitmq
2、配置环境变量
vi ~/.bash_profile
export RABBIT_HOME=${PATH}:/opt/homebrew/opt/rabbitmq
export PATH=${PATH}:$RABBIT_HOME/sbin
source ~/.bash_profile
2.3 启动RabbitMQ
1、前台运行
rabbitmq-server
2、后台运行
rabbitmq-server -detached
3、查看运行状态
rabbitmqctl status
4、开始 Web插件
rabbitmq-plugins enable rabbitmq_management
5、重启
rabbitmq-server restart
5、关闭
rabbitmqctl stop
2.4、访问MQ
1、浏览器地址
http://localhost:15672/
默认用户名和密码为guest
添加用户
rabbitmqctl add_user miaojiang 123
设置用户为管理员
rabbitmqctl set_user_tags miaojiang administrator
配置用户可以远程登录
rabbitmqctl set_permissions -p "/" miaojaing ".*" ".*" ".*"
查看新添加的账户
rabbitmqctl list_users
查看用于的权限
rabbitmqctl list_permissions -p /
三、Spring Boot 项目应用RabbitMQ
3.1、添加Maven依赖:
在你的项目的pom.xml文件中添加RabbitMQ客户端库的依赖
<!--AMQP依赖,包含RabbitMQ-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
3.2、配置RabbitMQ连接:
在Spring Boot的配置文件(application.properties 或 application.yml)中添加RabbitMQ的连接信息。
application.properties:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
在application.yml配置mq的参数:
spring:rabbitmq:#设置RabbitMQ的IP地址host: localhost#设置rabbitmq服务器用户名username: guest#设置rabbitmq服务器密码password: guest#设置rabbitmq服务器连接端口port: 5672
3.3 创建交换机
自定义交换机名称
创建名为“myExchange”的交换机
package com.example.usermanagement.mq;import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {/*使用 @Configuration 注解创建一个配置类,并通过 @Bean 注解创建了一个名为 declareExchange 的方法,用于声明创建交换机。请根据实际情况修改交换机名称、类型和持久化设置。*/public static final String EXCHANGE_NAME = "myExchange";@Beanpublic Exchange declareExchange() {return ExchangeBuilder.directExchange(EXCHANGE_NAME).durable(true).build();}
}
3.4 创建消息发送者
创建消息发送者:创建一个消息发送者的类,用于发送消息到RabbitMQ
package com.example.usermanagement.mq;import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MessageSender{private final AmqpTemplate amqpTemplate;private final String exchangeName = "myExchange"; // 自定义交换机名称@Autowiredpublic MessageSender(AmqpTemplate amqpTemplate) {this.amqpTemplate = amqpTemplate;}public void sendMessage(Object message) {amqpTemplate.convertAndSend(exchangeName, "", message); // 发送消息到默认交换机和空路由键}
}
注意:
sendMessage 类型使用的是Object类型
3.5 RabbitMQ管理后台添加对列
步骤:
-
打开浏览器,输入RabbitMQ管理后台的URL。默认情况下,该URL为
http://localhost:15672/。请确保你的RabbitMQ服务器正在运行,并且端口号正确。 -
输入用户名和密码以登录到RabbitMQ管理后台。默认情况下,用户名为
guest,密码也为guest。如果你修改过用户名和密码,请使用你的自定义凭据进行登录。 -
成功登录后,你将看到RabbitMQ管理后台的主界面。在顶部导航栏中,选择
Queues选项卡。 -
在
Queues页面上,你将看到已经存在的队列列表。如果你想要创建一个新队列,请点击Add a new queue按钮。 -
在添加队列的页面上,填写以下信息:
Name:队列的名称。为队列提供一个唯一的名称。(如myQueue)Durability:队列的持久性。选择是或否,以指定队列是否应该在RabbitMQ服务重启后保留。Auto delete:队列的自动删除。选择是或否,以指定当最后一个消费者断开连接后,是否删除队列。Arguments:队列的其他参数。这是可选的,你可以为队列设置一些特定的参数。
-
填写完队列信息后,点击
Add queue按钮以创建队列。 -
创建成功后,你将在
Queues页面上看到新添加的队列。你可以在该页面上查看队列的详细信息,包括消息数量、消费者数量等。
http://localhost:15672/#/queues
只需要添加队列名称就可以

3.6 调用生产者
1、注入MessageSender实例
@Autowired
private MessageSender messageSender;
2、在需要发送消息的地方调用messageSender.sendMessage方法。根据你的业务逻辑,你可以在合适的位置调用该方法。例如,在订单创建成功后,你可以添加以下代码:
messageSender.sendMessage("订单已创建:" + order.getOrderId());
3.7 创建消息接收者
创建消息接收者:创建一个消息接收者的类,用于处理接收到的RabbitMQ消息。
这里就直接写处理RabbitMQ消息的逻辑。
package com.example.usermanagement.mq;import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class MessageReceiver {@RabbitListener(bindings = @QueueBinding(value = @Queue("your_queue_name"),exchange = @Exchange(value = RabbitMQConfig.EXCHANGE_NAME)
// key = "your_routing_key"))public void receiveMessage(Object message) {System.out.println("Received message: " + message);// 处理消息逻辑}
}
注意:
sendMessage 类型使用的是Object类型
your_queue_name 替换为你要监听的队列的名称,(如myQueue)
将 your_routing_key 替换为适当的路由键(如果使用)
相关文章:
Spring Boot 项目应用消息服务器RabbitMQ(简单介绍)
一、背景 本章讲述的是在用户下单环节,消息服务器RabbitMQ 的应用 1.1 消息服务器的应用 在写一个电商项目的小demo,在电商项目中,消息服务器的应用: 1、订单状态通知:当用户下单、支付成功、订单发货、订单完成等…...
HBuilderX
HX 简介下载安装 简介 HBuilderX 是一款由 DCloud 开发的集成开发环境 (IDE),主要用于前端开发和移动应用开发。它基于 Visual Studio Code 平台,针对 Web 开发、小程序开发、移动端开发等提供了丰富的功能和插件。 DCloud官网: https://www.dcloud.io …...
C数据结构与算法——常见排序算法时间复杂度比较 应用
实验任务 (1) 掌握常见比较排序算法的实现; (2) 掌握常用比较排序算法的性能及其适用场合。 实验内容 (1) 平均时间复杂度O(n2)和O(nlog2n)的算法至少各选两种实现; (2) 待排序的无重复关键字存放在一维整型数组中,数量为60000个ÿ…...
C++并发多线程--死锁问题及解决方法
1--死锁问题 死锁问题:两个线程访问资源时加锁,但都需要对方的资源才能执行释放锁; 代码实例:下面的代码中,当线程 1 使用 my_mutex1 上锁后,会继续使用 my_mutex2 进行上锁,若此时线程 2 已经使…...
【Spring】纯注解开发
1、简介 在Spring3.0升级了纯注解开发模式,使用Java类来代替配置文件,开启了Spring快速开发赛道。 2、定义bean Component Service Controller Repository 3、纯注解开发 使用Configuration声明一个配置类,使用ComponentScan来扫描作为bea…...
【算法心得】正确估计dfs时间复杂度;剪枝优化不怕重构
https://leetcode.cn/problems/verbal-arithmetic-puzzle/ 这题看到题,“表达式中使用的不同字符数最大为 10”,就觉得dfs就完事了,最多不过10!,10!才1e6,1e7这样。如果字符再少点,6! 7! 8!的,…...
通过网关访问微服务,一次正常,一次不正常 (nacos配置的永久实例却未启动导致)
微服务直接访问没问题,通过网关访问,就一次正常访问,一次401错误,交替正常和出错 负载均衡试了 路由配置检查了 最后发现nacos下竟然有2个order服务实例,我明明只开启了一个呀 原来之前的8080端口微服务还残留&…...
div输入框的文字超过指定行数用省略号表示css
实现效果:超过四行用省略号表示 实现方法: .text{overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 4; // 自定义行数-webkit-box-orient: vertical; }...
STM32 F103C8T6学习笔记5:定时器输出不同占空比PWM驱动舵机旋转角度
现在学习使用STM32 F103C8T6的定时器PWM模式,使用PWM驱动舵机转动不同角度,文章提供源码,测试工程,测试动态效果图。 目录 基础原理: 实验目标: 测试视频结果: 测试工程下载: 基…...
液体神经网络:LNN是个啥概念?
一、说明 在在人工智能领域,神经网络已被证明是解决复杂问题的非常强大的工具。多年来,研究人员不断寻求创新方法来提高其性能并扩展其能力。其中一种方法是液体神经网络(LNN)的概念,这是一个利用动态计算功能的迷人框…...
开源数据库Mysql_DBA运维实战 (DCL/日志)
SQL(Structured Query Language 即结构化查询语言) a.DDL语句 数据库定义语言: 数据库,表,视图,索引,存储过程,函数,创建删除ALTER(CREATE DROP ALTER) b.DML语句 数…...
神经网络基础-神经网络补充概念-03-逻辑回归损失函数
概念 逻辑回归使用的损失函数通常是"对数损失"(也称为"交叉熵损失")或"逻辑损失"。这些损失函数在训练过程中用于衡量模型预测与实际标签之间的差异,从而帮助模型逐步调整权重参数,以更好地拟合数…...
基于深度信念神经网络的矿石产量预测,基于DBN的矿石产量预测,DBN的详细原理
目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) DBN的矿石产量预测 基本结构 主要参数 数据 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,是一种非常好的分类算法,本文将DBN算法进行矿石产量预测 DB…...
JavaWeb-Filter过滤器
目录 Filter过滤器 1. Filter的生命周期 2.Filter的配置 3.拦截路径 4.拦截具体的使用 5.拦截方式配置(资源被访问方式) 6.FilterChain拦截链 Filter过滤器 filter是过滤器,相比于Servlet的发送请求,filter是用于拦截请求。…...
python如何实现1ms内触发两个接口请求
在Python中,可以通过多线程或者协程来实现1ms内触发两个接口请求。以下是两种方法的示例代码: 1.多线程实现: import threading import requestsdef send_request(url):response requests.get(url)print(response.text)# 创建两个线程&…...
深入解析路由与网络:网络的脉络
目录 路由 广域网 公网 外网 局域网 内网 以太网 Wi-Fi CDN IPv4和IPv6 IP地址分类 无类别域间路由(CIDR) 路由 路由是指在计算机网络中,将数据包从源地址传递到目标地址的过程。在一个复杂的网络中,数据包需要经过多…...
spring.HttpMessageNotReadableException: JSON parse error
实体类如下: Value public class Search{//搜索内容String value;//是否模糊搜索boolean fuzzy true; //其实这样写并不是“默认”模糊搜索,而是“一定是”模糊搜索 }spring.HttpMessageNotReadableException: JSON parse error: Cannot construct ins…...
安全中间件的设计思路和简单实践
rasp 的侵入式特性和拦截特性导致开发和运维普通不太愿意配合,当生产环境出现问题时往往第一时间先把责任推给 rasp,逐渐的安全部门普遍只能把 rasp 设置为告警模式,而且越是大的集群拦截开的就越少,所以字节的 elkeid 和某外卖大…...
试卷扫描成电子版方法分享,这个方法不要错过
很多时候,为了方便传输我们需要将试卷扫描成电子版进行存档,以备不时之需。很多小伙伴如果遇到试卷需要扫描转成电子版可能就不知道该如何操作了,其实试卷扫描是一项非常重要的工作,因此需要注意一些方法和细节。以下是试卷扫描成…...
【PostgreSQL的CLOG解析】
同样还是这张图,之前发过shared_buffer和os cache、wal buffer和work mem的文章,今天的主题是图中的clog,即 commit log,PostgreSQL10之前放在数据库目录的pg_clog下面。PostgreSQL10之后修更名为xact,数据目录变更为pg_xact下面&…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
