一、前言

延时队列应用于什么场景
延时队列顾名思义,即放置在该队列里面的消息是不需要立即消费的,而是等待一段时间之后取出消费。
那么,为什么需要延迟消费呢?我们来看以下的场景:
网上商城下订单后30分钟后没有完成支付,取消订单(如:淘宝、去哪儿网)
系统创建了预约之后,需要在预约时间到达前一小时提醒被预约的双方参会
系统中的业务失败之后,需要重试
这些场景都非常常见,我们可以思考,比如第二个需求,系统创建了预约之后,需要在预约时间到达前一小时提醒被预约的双方参会。那么一天之中肯定是会有很多个预约的,时间也是不一定的,假设现在有1点 2点 3点 三个预约,如何让系统知道在当前时间等于0点 1点 2点给用户发送信息呢,是不是需要一个轮询,一直去查看所有的预约,比对当前的系统时间和预约提前一小时的时间是否相等呢?这样做非常浪费资源而且轮询的时间间隔不好控制。如果我们使用延时消息队列呢,我们在创建时把需要通知的预约放入消息中间件中,并且设置该消息的过期时间,等过期时间到达时再取出消费即可。
Rabbitmq实现延时队列一般而言有两种形式:
第一种方式:利用两个特性: Time To Live(TTL)、Dead Letter Exchanges(DLX)
第二种方式:利用rabbitmq中的插件x-delay-message

二、安装延迟插件

1.rabbit官网下载插件
https://www.rabbitmq.com/community-plugins.html

2.找到这个插件

3.下载下来复制到RabbitMQ Server\rabbitmq_server-3.7.8\plugins中

4.doc运行:rabbitmq-plugins enable rabbitmq_delayed_message_exchange

三、代码实现

1.配置 队列

import com.example.rabbitmq.mq.DirectConfig;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;@Configuration
public class DelayedConfig {final static String QUEUE_NAME = "delayed.goods.order";final static String EXCHANGE_NAME = "delayedec";@Beanpublic Queue queue() {return new Queue(DelayedConfig.QUEUE_NAME);}// 配置默认的交换机@BeanCustomExchange customExchange() {Map<String, Object> args = new HashMap<>();args.put("x-delayed-type", "direct");//参数二为类型:必须是x-delayed-messagereturn new CustomExchange(DelayedConfig.EXCHANGE_NAME, "x-delayed-message", true, false, args);}// 绑定队列到交换器@BeanBinding binding(Queue queue, CustomExchange exchange) {return BindingBuilder.bind(queue).to(exchange).with(DelayedConfig.QUEUE_NAME).noargs();}
}

2.发送消息

import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
public class DelayedSender {@Autowiredprivate AmqpTemplate rabbitTemplate;public void send(String msg) {SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("发送时间:" + sf.format(new Date()));rabbitTemplate.convertAndSend(DelayedConfig.EXCHANGE_NAME, DelayedConfig.QUEUE_NAME, msg, new MessagePostProcessor() {@Overridepublic Message postProcessMessage(Message message) throws AmqpException {message.getMessageProperties().setHeader("x-delay", 3000);return message;}});}
}

3.消费消息

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;@Component
@RabbitListener(queues = "delayed.goods.order")
public class DelayedReceiver {@RabbitHandlerpublic void process(String msg) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("接收时间:" + sdf.format(new Date()));System.out.println("消息内容:" + msg);}
}

4.测试队列

import com.example.rabbitmq.RabbitmqApplication;
import com.example.rabbitmq.mq.delayed.DelayedSender;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.text.SimpleDateFormat;
import java.util.Date;@RunWith(SpringRunner.class)
@SpringBootTest
public class DelayedTest {@Autowiredprivate DelayedSender sender;@Testpublic void Test() throws InterruptedException {SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");sender.send("Hi Admin.");Thread.sleep(5 * 1000); //等待接收程序执行之后,再退出测试}
}

执行结果如下:
发送时间:2019-12-18 20:47:51
接收时间:2019-12-18 20:47:54
消息内容:Hi Admin.

SpringBoot+RabbitMQ之延迟队列相关推荐

  1. SpringBoot之使用RabbitMQ实现延迟队列

    在我们的各个项目中,经常会有这样的需求. 订单模块:在订单下单后30分钟如果没有付款,就自动取消订单, 短信模块:在下单成功后60s给用户发送短信通知 支付模块:在微信/支付宝支付成功后,1分钟后去调 ...

  2. rabbitMq实现延迟队列

    文章目录 业务场景: 1 安装rabbitMq 2 添加maven依赖 3 在application.properties配置 4 具体的实现 4.1 Dead Letter Exchanges 4. ...

  3. docker rabbitmq 安装 延迟队列 rabbitmq_delayed_message_exchange 插件

    以  官方的 rabbitmq:3.9.20-management 为例,默认开启的插件有4个,如下所示 2022-07-09 21:31:55.624125+08:00 [info] <0.8 ...

  4. RabbitMQ实现延迟队列的方式

    1.背景 最近在做类似拍卖系统的上架功能,卖家上架物品以后,例如到期时间24小时或者48小时,如果无竞拍者或者购买者,则物品自动下架到用户的邮件中.诸如电商用户下单,30分钟未支付,则自动取消订单,归 ...

  5. 【不是拷贝】rabbitmq安装延迟队列插件rabbitmq_delayed_message_exchange

    1.查看当前rabbitmq已安装的插件 查看当前的rabbitmq 安装了哪些插件: rabbitmq-plugins list [root@yq-test1 ~]# rabbitmq-plugin ...

  6. RabbitMQ 延迟队列实现定时任务的正确姿势,你学会了么?

    以下文章来源方志朋的博客,回复"666"获面试宝典 场景 开发中经常需要用到定时任务,对于商城来说,定时任务尤其多,比如优惠券定时过期.订单定时关闭.微信支付2小时未支付关闭订单等 ...

  7. RabbitMQ —— 延迟队列

    RabbitMQ实现延迟队列一:在队列上设置TTL Publish --> delaysync.exchange --> delay.5m.queue(延迟队列) --> delay ...

  8. RabbitMQ如何实现延迟队列?

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  9. python延时队列_如何通过Python实现RabbitMQ延迟队列

    最近在做一任务时,遇到需要延迟处理的数据,最开始的做法是现将数据存储在数据库,然后写个脚本,隔五分钟扫描数据表再处理数据,实际效果并不好.因为系统本身一直在用rabbitmq做异步处理任务的中间件,所 ...

最新文章

  1. 输入法半角和全角的快捷转换_日语输入法究极指南
  2. 如何删除 AWS 资源以及关闭账户(来自亚马逊官方提供文档,记录一下方便查看)
  3. jquery 日期选择器
  4. 【概率论】复习资料(手写复习)
  5. 经典语音降噪方法-谱减法
  6. vue子组件的使用和事件传递
  7. Flink CEP greedy理解
  8. 谷歌浏览器87版本 iframe_谷歌Chrome的“混合内容”更新将会影响电商网站,自建站卖家如何应对?...
  9. 微信小程序的疫情防控系统
  10. Termios 函数说明
  11. 计算机应用基础课程的评价方法,对计算机应用基础课程评价方法探讨.doc
  12. 计算机的收获初一作文,初一开学一个月的收获和感受作文
  13. 中国全国城市列表JSON数据2022最新
  14. 新建几个普通用户wukong,wuneng,wujing,他们都属于xiyouji组的成员,其中wujing没有和系统交互的shell~
  15. 计算机基础知识 JAVA基础知识
  16. 使用Hystrix实现单个方法
  17. github视频录制播放相关功能-参考
  18. Java数组截取如何实现?Java语言教程
  19. 4k 计算机配置,高配战4K 让你体验4K分辨率的配置推荐
  20. 强强联手,直播+短视频,碰撞出灿烂的烟火

热门文章

  1. RMAN BACKUP ... PLUS ARCHIVELOG ORA-19809
  2. linux下xampp的安装和配置文件,linux下xampp集成包安装配置方法
  3. 用模拟开关芯片直接驱动继电器电路
  4. 安装VScode(从官网)
  5. 线程学习(三):线程的互斥
  6. 袋鼠云数栈DTinsight与10家信创厂家完成产品兼容互认证,携手共建信创生态圈
  7. 开机启动计算机时 屏幕无显示桌面,电脑不显示桌面(电脑开机黑屏无显示)...
  8. 湖南大学计算机网络实验二------水
  9. JVM调优理论篇_二、常用垃圾回收器(JVM10种垃圾回收器)以及垃圾回收算法
  10. 深圳工业设计行业发展前景怎样?