118、商城业务---分布式事务---RabbitMQ延时队列定时关单模拟
1、使用RabbitMq实现延时队列方法1

2、基于我们的业务我们使用下面这种方式实现延时队列

1、导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2、编写rabbitmq的相关配置

3、开启rabbitmq

4、编写配置类来创建队列、交换机、绑定关系
package com.gulimall.order.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
/**
* 使用配置类快速创建交换机、队列、绑定关系
*/
@Configuration
public class MyRabbitMqConfig {
/**
* @Bean的作用是自动给rabbitmq创建我们的交换机、队列、绑定关系
* @return
*/
/**
* 监听我们的死信队列 【由于我们在配置文件中设置了手动ack消息,所以我们在这里通过Chnnel来接受消息】
* @return
*/
@RabbitListener(queues = "order.release.order.queue")
public void listener(OrderEntity order, Channel channel, Message message) throws IOException {
String orderSn = order.getOrderSn();
System.out.println("收到过期消息:" + orderSn);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); //手动确认消息
}
//一个交换机
@Bean
public Exchange orderEventExchange(){
/**
* 对于只有一个交换机的设计,我们一般创建一个topic交换机
* (String name, boolean durable, boolean autoDelete, Map<String, Object> arguments
*/
return new TopicExchange("order-event-exchange", true, false);
}
//死信队列
@Bean
public Queue orderDelayQueue(){
/**
* 配置参数
* x-dead-letter-exchange: order-event-exchange
* x-dead-letter-routing-key: order.release.order
* x-message-ttl: 60000
*/
Map<String, Object> arguments = new HashMap<>();
arguments.put("x-dead-letter-exchange", "order-event-exchange");//死信路由到order-event-exchange交换机
arguments.put("x-dead-letter-routing-key", "order.release.order");//死信路由键
arguments.put("x-message-ttl", 60000);//消息过期时间
/**
* String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments
*/
Queue queue = new Queue("order.delay.queue", true, false, false, arguments);
return queue;
}
//普通队列
@Bean
public Queue orderReleaseOrderQueue(){
/**
* String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments
*/
Queue queue = new Queue("order.release.order.queue", true, false, false);
return queue;
}
//交换机绑定队列
@Bean
public Binding orderCreateOrderBinding(){
/**
* String destination, DestinationType destinationType, String exchange, String routingKey, Map<String, Object> arguments
*/
return new Binding("order.delay.queue", Binding.DestinationType.QUEUE, "order-event-exchange", "order.create.order", null);
}
//交换机绑定队列
@Bean
public Binding orderReleaseOrderBinding(){
/**
* String destination, DestinationType destinationType, String exchange, String routingKey, Map<String, Object> arguments
*/
return new Binding("order.release.order.queue", Binding.DestinationType.QUEUE, "order-event-exchange", "order.release.order", null);
}
}
重启项目后,如果发现rabbitmq官网上面没有自动给我们创建交换机和队列,我们只需要给rabbitmq发送一个请求即可自动创建,我的请求如下

118、商城业务---分布式事务---RabbitMQ延时队列定时关单模拟的更多相关文章
- rabbitmq 延时队列
前言 某个产品 或者订单,有个有效期 过了有效期要取消 方法一 : 写个脚本,用crontab 定时扫描 改变状态 但是最低只能一分钟 ,不适合 方法二 : 用swoole得毫秒定时器,每秒钟去扫描表 ...
- RabbitMQ延时队列应用场景
应用场景 我们系统未付款的订单,超过一定时间后,需要系统自动取消订单并释放占有物品 常用的方案 就是利用Spring schedule定时任务,轮询检查数据库 但是会消耗系统内存,增加了数据库的压力. ...
- java实现rabbitMQ延时队列详解以及spring-rabbit整合教程
在实际的业务中我们会遇见生产者产生的消息,不立即消费,而是延时一段时间在消费.RabbitMQ本身没有直接支持延迟队列功能,但是我们可以根据其特性Per-Queue Message TTL和 Dead ...
- IOS IAP 自动续订 之 利用rabbitmq延时队列自动轮询检查是否续订成功
启用针对自动续期订阅的服务器通知: - 官方地址: - https://help.apple.com/app-store-connect/#/dev0067a330b - 相关字段, 相关类型地址: ...
- rabbitmq 延时队列 插件方式实现 每条消息都延时自己时间
上篇文章的延时是加到队列上的 通过死信过时推送 ,缺点就是不能每条消息定义自己的过时时间而且每次有新的过时时间,要新建一个交换机和队列 https://www.cnblogs.com/brady-wa ...
- RabbitMQ 延时消息队列
消息延时在日常随处可见: 1.订单创建10min之后不发起支付,自动取消. 2.30min定时推送一次邮件信息. 最常用到方式后台定时任务轮训,量小的时候可以使用,量大会出现数据读取会性能问题.Rab ...
- 基于rabbitMQ 消息延时队列方案 模拟电商超时未支付订单处理场景
前言 传统处理超时订单 采取定时任务轮训数据库订单,并且批量处理.其弊端也是显而易见的:对服务器.数据库性会有很大的要求,并且当处理大量订单起来会很力不从心,而且实时性也不是特别好 当然传统的手法还可 ...
- 面试官:RabbitMQ过期时间设置、死信队列、延时队列怎么设计?
哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 RabbitMQ我们经常的使用, ...
- 基于Redis实现延时队列服务
背景 在业务发展过程中,会出现一些需要延时处理的场景,比如: a.订单下单之后超过30分钟用户未支付,需要取消订单 b.订单一些评论,如果48h用户未对商家评论,系统会自动产生一条默认评论 c.点我达 ...
- 【转】基于Redis实现延时队列服务
背景 在业务发展过程中,会出现一些需要延时处理的场景,比如: a.订单下单之后超过30分钟用户未支付,需要取消订单b.订单一些评论,如果48h用户未对商家评论,系统会自动产生一条默认评论c.点我达订单 ...
随机推荐
- android 获取手机的唯一id,获取当前时间,获取两位随机数
//获取机器的唯一id public static String getDeviceID() { String deviceID= ""; try{ //一共13位 如果位数不够可 ...
- ubuntu扩容
VMware虚拟机 Linux系统 Ubuntu 16.04 硬盘/磁盘扩容效果查看硬盘大小及使用情况 终端:df -h 没有扩容前: 成功扩容后: 主要流程扩展硬盘大小到100G将未分配的60G分配 ...
- 浅谈tcp 与udp
tcp是一种面向连接的.可靠的.基于字节流的传输层通信协议.是专门为了在不可靠的互联网络上提供一个可靠的端到端字节流而设计的,面向字节流. udp(用户数据报协议)是iso参考模型中一种无连接的传输层 ...
- Java方法之递归详解【重点】
递归详解 A方法调用B方法,我们很容易理解! 递归就是:A方法调用A方法!就是自己调用自己. 利用递归可以用简单的程序来解决一些复杂的问题.它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较 ...
- 上传镜像到harbor
https://blog.csdn.net/weixin_45335305/article/details/123817541
- 055_Lightning Lightning 组件基础知识
Lightning框架简介 Lightning框架是Salesforce提供的一套基于用户界面的开发框架,对于开发单页面应用(Single Page Application)有很大的帮助.它和Visu ...
- MySQL日期/时间函数
1.查询当前时间函数: select NOW(),LOCALTIME(),SYSDATE(),CURRENT_TIMESTAMP(); 但是now()与sysdate()有点差异的,一个语句中now( ...
- 学习lua-03,集合排序,集合插入元素
array = {"Google", "Runoob"} table.insert(array,1,"hello world!") for ...
- calibredrv命令
flattencell: set L1 [layout create *.gds -dt_expand] $L1 flatten cell TOP_CELL_NAME $L1 gdsout ./*_f ...
- mysql循环插入分隔符分开的字符串
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`()BEGIN DECLARE i,help_topic_id INT; SET i=10469; ...