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延时队列定时关单模拟的更多相关文章

  1. rabbitmq 延时队列

    前言 某个产品 或者订单,有个有效期 过了有效期要取消 方法一 : 写个脚本,用crontab 定时扫描 改变状态 但是最低只能一分钟 ,不适合 方法二 : 用swoole得毫秒定时器,每秒钟去扫描表 ...

  2. RabbitMQ延时队列应用场景

    应用场景 我们系统未付款的订单,超过一定时间后,需要系统自动取消订单并释放占有物品 常用的方案 就是利用Spring schedule定时任务,轮询检查数据库 但是会消耗系统内存,增加了数据库的压力. ...

  3. java实现rabbitMQ延时队列详解以及spring-rabbit整合教程

    在实际的业务中我们会遇见生产者产生的消息,不立即消费,而是延时一段时间在消费.RabbitMQ本身没有直接支持延迟队列功能,但是我们可以根据其特性Per-Queue Message TTL和 Dead ...

  4. IOS IAP 自动续订 之 利用rabbitmq延时队列自动轮询检查是否续订成功

    启用针对自动续期订阅的服务器通知: - 官方地址: - https://help.apple.com/app-store-connect/#/dev0067a330b - 相关字段, 相关类型地址:  ...

  5. rabbitmq 延时队列 插件方式实现 每条消息都延时自己时间

    上篇文章的延时是加到队列上的 通过死信过时推送 ,缺点就是不能每条消息定义自己的过时时间而且每次有新的过时时间,要新建一个交换机和队列 https://www.cnblogs.com/brady-wa ...

  6. RabbitMQ 延时消息队列

    消息延时在日常随处可见: 1.订单创建10min之后不发起支付,自动取消. 2.30min定时推送一次邮件信息. 最常用到方式后台定时任务轮训,量小的时候可以使用,量大会出现数据读取会性能问题.Rab ...

  7. 基于rabbitMQ 消息延时队列方案 模拟电商超时未支付订单处理场景

    前言 传统处理超时订单 采取定时任务轮训数据库订单,并且批量处理.其弊端也是显而易见的:对服务器.数据库性会有很大的要求,并且当处理大量订单起来会很力不从心,而且实时性也不是特别好 当然传统的手法还可 ...

  8. 面试官:RabbitMQ过期时间设置、死信队列、延时队列怎么设计?

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 RabbitMQ我们经常的使用, ...

  9. 基于Redis实现延时队列服务

    背景 在业务发展过程中,会出现一些需要延时处理的场景,比如: a.订单下单之后超过30分钟用户未支付,需要取消订单 b.订单一些评论,如果48h用户未对商家评论,系统会自动产生一条默认评论 c.点我达 ...

  10. 【转】基于Redis实现延时队列服务

    背景 在业务发展过程中,会出现一些需要延时处理的场景,比如: a.订单下单之后超过30分钟用户未支付,需要取消订单b.订单一些评论,如果48h用户未对商家评论,系统会自动产生一条默认评论c.点我达订单 ...

随机推荐

  1. knife4j 整合springboot

    1.添加依赖 <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife ...

  2. iOS开发之检测项目是否包含UIWebView

    应苹果审核要求不能包含UIWebView,所以我们上线之前应该扫一下项目是否包含UIWebView 我们直接打开终端 cd 到工程文件下面 执行命令 grep -r UIWebView .  在扫描结 ...

  3. 整合mybatis实现简单的增删改查

    mybatis配置相关代码 配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE conf ...

  4. JWT & 用户身份认证演变过程

    一.起源 0.HTTP无状态 HTTP是无状态的,服务端和客户端如何保持登录状态? 工程师在服务端搞了亿点事情, 就有了下面的解决方案. 1.session认证 (1)什么是session? 服务器为 ...

  5. C# 以管理员方式运行程序

    让你的程序以管理员方式运行 在Program.cs文件中添加如下代码 /// <summary> /// 应用程序的主入口点. /// </summary> [STAThrea ...

  6. C# 屏蔽词过滤

    参考:https://www.cnblogs.com/kubidemanong/p/10834993.html public class TreeNode { public char Char; pu ...

  7. 如何保证RabbitMQ的消息不会丢失?怎么保证RabbitMQ的可靠性?

    生产者: 原因: 由于网络原因导致消息发送失败,消息队列没有接收到生产者发送的消息,但生产者认为消息发送成功. 解决办法: transaction模式:事务模式:开启事务,发送消息,成功提交事务,失败 ...

  8. 树莓派4B的Node-Red编程(一)

    一.树莓派烧写 二.Node-Red 环境搭建 (一)安装Node.js (二)安装Node-Red (三)启动服务:win+R输入CMD:输入Node-red. (四)进入浏览器127.0.0.1: ...

  9. Debug --> wireshark中的lua插件使用

    一.使用Lua脚本对pcap文件按流进行存储 https://zhuanlan.zhihu.com/p/35188803 二.使用tshark对pcap报文进行批量切流 https://blog.cs ...

  10. 攻防(一)tomcat CVE-2020-1938 ftp 21端口

    TOMCAT kali自带POE msf6 > use auxiliary/admin/http/tomcat_ghostcat set RHOST 10.98.xx.xx msf6 auxil ...