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

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管理后台添加对列

步骤:

  1. 打开浏览器,输入RabbitMQ管理后台的URL。默认情况下,该URL为http://localhost:15672/。请确保你的RabbitMQ服务器正在运行,并且端口号正确。

  2. 输入用户名和密码以登录到RabbitMQ管理后台。默认情况下,用户名为guest,密码也为guest。如果你修改过用户名和密码,请使用你的自定义凭据进行登录。

  3. 成功登录后,你将看到RabbitMQ管理后台的主界面。在顶部导航栏中,选择Queues选项卡。

  4. Queues页面上,你将看到已经存在的队列列表。如果你想要创建一个新队列,请点击Add a new queue按钮。

  5. 在添加队列的页面上,填写以下信息:

    • Name:队列的名称。为队列提供一个唯一的名称。(如myQueue)
    • Durability:队列的持久性。选择是或否,以指定队列是否应该在RabbitMQ服务重启后保留。
    • Auto delete:队列的自动删除。选择是或否,以指定当最后一个消费者断开连接后,是否删除队列。
    • Arguments:队列的其他参数。这是可选的,你可以为队列设置一些特定的参数。
  6. 填写完队列信息后,点击Add queue按钮以创建队列。

  7. 创建成功后,你将在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(简单介绍)

一、背景 本章讲述的是在用户下单环节&#xff0c;消息服务器RabbitMQ 的应用 1.1 消息服务器的应用 在写一个电商项目的小demo&#xff0c;在电商项目中&#xff0c;消息服务器的应用&#xff1a; 1、订单状态通知&#xff1a;当用户下单、支付成功、订单发货、订单完成等…...

HBuilderX

HX 简介下载安装 简介 HBuilderX 是一款由 DCloud 开发的集成开发环境 (IDE)&#xff0c;主要用于前端开发和移动应用开发。它基于 Visual Studio Code 平台&#xff0c;针对 Web 开发、小程序开发、移动端开发等提供了丰富的功能和插件。 DCloud官网: https://www.dcloud.io …...

C数据结构与算法——常见排序算法时间复杂度比较 应用

实验任务 (1) 掌握常见比较排序算法的实现&#xff1b; (2) 掌握常用比较排序算法的性能及其适用场合。 实验内容 (1) 平均时间复杂度O(n2)和O(nlog2n)的算法至少各选两种实现&#xff1b; (2) 待排序的无重复关键字存放在一维整型数组中&#xff0c;数量为60000个&#xff…...

C++并发多线程--死锁问题及解决方法

1--死锁问题 死锁问题&#xff1a;两个线程访问资源时加锁&#xff0c;但都需要对方的资源才能执行释放锁&#xff1b; 代码实例&#xff1a;下面的代码中&#xff0c;当线程 1 使用 my_mutex1 上锁后&#xff0c;会继续使用 my_mutex2 进行上锁&#xff0c;若此时线程 2 已经使…...

【Spring】纯注解开发

1、简介 在Spring3.0升级了纯注解开发模式&#xff0c;使用Java类来代替配置文件&#xff0c;开启了Spring快速开发赛道。 2、定义bean Component Service Controller Repository 3、纯注解开发 使用Configuration声明一个配置类&#xff0c;使用ComponentScan来扫描作为bea…...

【算法心得】正确估计dfs时间复杂度;剪枝优化不怕重构

https://leetcode.cn/problems/verbal-arithmetic-puzzle/ 这题看到题&#xff0c;“表达式中使用的不同字符数最大为 10”&#xff0c;就觉得dfs就完事了&#xff0c;最多不过10!&#xff0c;10!才1e6&#xff0c;1e7这样。如果字符再少点&#xff0c;6! 7! 8!的&#xff0c;…...

通过网关访问微服务,一次正常,一次不正常 (nacos配置的永久实例却未启动导致)

微服务直接访问没问题&#xff0c;通过网关访问&#xff0c;就一次正常访问&#xff0c;一次401错误&#xff0c;交替正常和出错 负载均衡试了 路由配置检查了 最后发现nacos下竟然有2个order服务实例&#xff0c;我明明只开启了一个呀 原来之前的8080端口微服务还残留&…...

div输入框的文字超过指定行数用省略号表示css

实现效果&#xff1a;超过四行用省略号表示 实现方法&#xff1a; .text{overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 4; // 自定义行数-webkit-box-orient: vertical; }...

STM32 F103C8T6学习笔记5:定时器输出不同占空比PWM驱动舵机旋转角度

现在学习使用STM32 F103C8T6的定时器PWM模式&#xff0c;使用PWM驱动舵机转动不同角度&#xff0c;文章提供源码&#xff0c;测试工程&#xff0c;测试动态效果图。 目录 基础原理&#xff1a; 实验目标&#xff1a; 测试视频结果&#xff1a; 测试工程下载&#xff1a; 基…...

液体神经网络:LNN是个啥概念?

一、说明 在在人工智能领域&#xff0c;神经网络已被证明是解决复杂问题的非常强大的工具。多年来&#xff0c;研究人员不断寻求创新方法来提高其性能并扩展其能力。其中一种方法是液体神经网络&#xff08;LNN&#xff09;的概念&#xff0c;这是一个利用动态计算功能的迷人框…...

开源数据库Mysql_DBA运维实战 (DCL/日志)

SQL&#xff08;Structured Query Language 即结构化查询语言&#xff09; a.DDL语句 数据库定义语言&#xff1a; 数据库&#xff0c;表&#xff0c;视图&#xff0c;索引&#xff0c;存储过程&#xff0c;函数&#xff0c;创建删除ALTER(CREATE DROP ALTER) b.DML语句 数…...

神经网络基础-神经网络补充概念-03-逻辑回归损失函数

概念 逻辑回归使用的损失函数通常是"对数损失"&#xff08;也称为"交叉熵损失"&#xff09;或"逻辑损失"。这些损失函数在训练过程中用于衡量模型预测与实际标签之间的差异&#xff0c;从而帮助模型逐步调整权重参数&#xff0c;以更好地拟合数…...

基于深度信念神经网络的矿石产量预测,基于DBN的矿石产量预测,DBN的详细原理

目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) DBN的矿石产量预测 基本结构 主要参数 数据 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,是一种非常好的分类算法,本文将DBN算法进行矿石产量预测 DB…...

JavaWeb-Filter过滤器

目录 Filter过滤器 1. Filter的生命周期 2.Filter的配置 3.拦截路径 4.拦截具体的使用 5.拦截方式配置&#xff08;资源被访问方式&#xff09; 6.FilterChain拦截链 Filter过滤器 filter是过滤器&#xff0c;相比于Servlet的发送请求&#xff0c;filter是用于拦截请求。…...

python如何实现1ms内触发两个接口请求

在Python中&#xff0c;可以通过多线程或者协程来实现1ms内触发两个接口请求。以下是两种方法的示例代码&#xff1a; 1.多线程实现&#xff1a; import threading import requestsdef send_request(url):response requests.get(url)print(response.text)# 创建两个线程&…...

深入解析路由与网络:网络的脉络

目录 路由 广域网 公网 外网 局域网 内网 以太网 Wi-Fi CDN IPv4和IPv6 IP地址分类 无类别域间路由&#xff08;CIDR&#xff09; 路由 路由是指在计算机网络中&#xff0c;将数据包从源地址传递到目标地址的过程。在一个复杂的网络中&#xff0c;数据包需要经过多…...

spring.HttpMessageNotReadableException: JSON parse error

实体类如下&#xff1a; Value public class Search{//搜索内容String value;//是否模糊搜索boolean fuzzy true; //其实这样写并不是“默认”模糊搜索&#xff0c;而是“一定是”模糊搜索 }spring.HttpMessageNotReadableException: JSON parse error: Cannot construct ins…...

安全中间件的设计思路和简单实践

rasp 的侵入式特性和拦截特性导致开发和运维普通不太愿意配合&#xff0c;当生产环境出现问题时往往第一时间先把责任推给 rasp&#xff0c;逐渐的安全部门普遍只能把 rasp 设置为告警模式&#xff0c;而且越是大的集群拦截开的就越少&#xff0c;所以字节的 elkeid 和某外卖大…...

试卷扫描成电子版方法分享,这个方法不要错过

很多时候&#xff0c;为了方便传输我们需要将试卷扫描成电子版进行存档&#xff0c;以备不时之需。很多小伙伴如果遇到试卷需要扫描转成电子版可能就不知道该如何操作了&#xff0c;其实试卷扫描是一项非常重要的工作&#xff0c;因此需要注意一些方法和细节。以下是试卷扫描成…...

【PostgreSQL的CLOG解析】

同样还是这张图&#xff0c;之前发过shared_buffer和os cache、wal buffer和work mem的文章&#xff0c;今天的主题是图中的clog&#xff0c;即 commit log&#xff0c;PostgreSQL10之前放在数据库目录的pg_clog下面。PostgreSQL10之后修更名为xact,数据目录变更为pg_xact下面&…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...