Springboot 使用 RabbitMq 延迟插件 实现订单到期未支付取消订单、设置提醒消息

本文主要是介绍Springboot 使用 RabbitMq 延迟插件 实现订单到期未支付取消订单、设置提醒消息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

示例业务场景:
场景1:客户下单后,15分钟内未支付取消订单!
场景2:客户下单支付成功后,5分钟内商家未处理订单,需要推送一条消息提醒商家。如依旧未处理,则需要每隔2分钟消息提醒一下商家!
这两种场景都是可以使用延迟消息来实现,rabbitMq 提供了2种实现延迟消息的方式,死信队列延迟插件

使用docker 安装部署 rabbitMq
1,下载rabbitMq镜像;

docker pull rabbitmq

2,启动rabbitMq 容器;

docker run -d --name rabbit001 -p 15672:15672 -p 5672:5672 rabbitmq -v rabbitMq:/etc/rabbitmq rabbitmq

3,运行完成后,rabbitMq 服务通过ip+15762 访问后管平台;
如果访问不了,则需要在容器内安装可视化插件;(在容器内的/plugins 目录内执行)

rabbitmq-plugins enable rabbitmq_management

4,安装延迟插件;
1,在官网内下载对应版本的延迟插件上传到服务器内;(例如在官网下载的延迟插件放在了/home/rabbitmq目录内)

docker cp /home/rabbitmq/rabbitmq_delayed_message_exchange-3.12.0.ez 4296be33b41e:plugins/

2,然后再进入容器内安装延迟插件;

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

5,重启rabbitMq容器再通过ip+15672 访问即可!初始登录账户密码:guest/guest

6,修改默认密码;

1,进入容器内;
2,查看用户列表:rabbitmqctl  list_users
3,修改guest密码(尽量设置复杂点):rabbitmqctl  change_password  guest  '@#20231126%&*'

7,通过死信队列实现延迟消息配置;

1,建立交换机:order-reserve-echage
2,建立队列 dead-queues,参数如下设置x-dead-letter-exchange:	order-reserve-echagex-dead-letter-routing-key:	key2x-message-ttl:	900000durable:	true
3,建立队列 receivedq,无其他参数;
4,再进到刚刚建立的交换机 order-reserve-echage 内去绑定路由键;dead-queues     key1	receivedq       key2

8,使用延时插件创建延迟队列;

1,建立延迟交换机:delayed-exchange注意:Type 是 x-delayed-messages 类型;添加一个参数:x-delayed-type    direct2,然后建立一个队列: delayed-queue ,无其他参数;3,然后再进到交换机 delayed-exchange 内去绑定路由键;delayed-queue   delayed-routing-key

以上 rabbitMq 安装配置好之后做以下介绍:
问:什么是死信队列?

就是一个普通的队列,只不过我们自行做两点约束:
1,设置了队列、或发往队列内的消息要有过期时间;
2,要确保没有消费者主动订阅消费该队列内的消息;

问:死信队列如何实现延迟消息的?

需要创建2个队列,一个死信队列,一个普通的队列。且需要创建一个交换机去绑定这两个队列。在创建死信队列时,需要指定一个 x-dead-letter-routing-key (也就是消息过期后需要重新发往的队列)。
我们发送消息到死信队列内,消息过期后会由交换机转发到 死信队列绑定的 x-dead-letter-routing-key 上。这个时候我们只需要监听普通队列即可。
例如:我们想要发一条消息 15 分钟后收到这条消息。那么我们就可以发送一条过期时间为15分钟的消息到 死信队列,在没有任何消费者消费的情况下,15分钟后这条消息会过期,过期后会由交换机转发给绑定的普通队列内,这时我们在 普通队列接受到的消息就是15分钟前发送的消息!

问:死信队列 和 延迟插件 实现的延迟消息有什么不同?

死信队列:先发的消息会先收到,后发的消息会后收到,不会受设置的消息过期时间控制;
例如:我先往死信队列内发一条15分钟后后期的消息,再发一条 3分钟后过期的消息。我们肯定是想先收到3分钟过期的消息,但是受队列特性的影响(先入先出),
我们只有在消费了先发的15分钟过期的消息后才能收到那条3分钟的消息!!!延迟插件:不会出现以上情况,以设置的过期时间先后顺序接收到消息!先发了 一条 15分钟延迟消息,再发一条 3分钟过期消息,会先收到 3分钟过期的消息

以上两种业务场景实现思路:
场景1:客户下单后,15分钟内未支付取消订单!

1,客户下单后发送一条15分钟的延迟消息,消息内带有 订单的id;
2,监听到延时消息后,拿到消息id去查询一下订单信息,如还未支付则取消订单。

场景2:客户下单支付成功后,5分钟内商家未处理订单,需要推送一条消息提醒商家。如依旧未处理,则需要每隔2分钟消息提醒一下商家!

1,客户下单支付成功后发送一条5分钟的延时消息,消息内带有订单id;
2,5分钟后监听到消息,则去判断下当前订单是否有没有被处理,如果还没被处理则提醒商家。并且再发一条2分钟的延时消息!
3,2分钟后再次监听到该消息后重复此步骤,如果商家未处理则提醒,并且再发延迟消息!

这篇关于Springboot 使用 RabbitMq 延迟插件 实现订单到期未支付取消订单、设置提醒消息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/427295

相关文章

详解Vue如何使用xlsx库导出Excel文件

《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三

如何设置vim永久显示行号

《如何设置vim永久显示行号》在Linux环境下,vim默认不显示行号,这在程序编译出错时定位错误语句非常不便,通过修改vim配置文件vimrc,可以在每次打开vim时永久显示行号... 目录设置vim永久显示行号1.临时显示行号2.永www.chinasem.cn久显示行号总结设置vim永久显示行号在li

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Linux:alias如何设置永久生效

《Linux:alias如何设置永久生效》在Linux中设置别名永久生效的步骤包括:在/root/.bashrc文件中配置别名,保存并退出,然后使用source命令(或点命令)使配置立即生效,这样,别... 目录linux:alias设置永久生效步骤保存退出后功能总结Linux:alias设置永久生效步骤

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例: