场景

用户下单后,如果30min未支付,则删除该订单,这时候就要可以用延迟队列

准备

利用rabbitmq_delayed_message_exchange插件;

首先下载该插件:https://www.rabbitmq.com/community-plugins.html

然后把该插件放到rabbitmq安装目录plugins下;

进入到sbin目录下,执行"rabbitmq-plugins.bat enable rabbitmq_delayed_message_exchange";

关闭RabbitMQ服务,然后再启动(直接重启该插件可能会不生效)。

SpringBoot RabbitMQ代码

application.properties配置文件

spring.application.name=spring-boot-rabbitmq
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=nut
spring.rabbitmq.password=nut

配置类

注意这里的"x-delayed-type"和"x-delayed-message"

/*** 延迟队列配置exchange*/
@Configuration
public class DelayQueueConfig {public static final String DELAY_EXCHANGE = "DELAY_EXCHANGE";public static final String DELAY_QUEUE = "DELAY_QUEUE";public static final String DELAY_ROUTING_KEY = "DELAY_ROUTING_KEY";@Bean("delayExchange")public Exchange delayExchange() {Map<String, Object> args = new HashMap<>(1);
//       x-delayed-type    声明 延迟队列Exchange的类型args.put("x-delayed-type", "direct");return new CustomExchange(DELAY_EXCHANGE, "x-delayed-message",true, false,args);}@Bean("delayQueue")public Queue delayQueue() {return QueueBuilder.durable(DELAY_QUEUE).build();}/*** 将延迟队列通过routingKey绑定到延迟交换器** @return*/@Beanpublic Binding delayQueueBindExchange() {return new Binding(DELAY_QUEUE, Binding.DestinationType.QUEUE, DELAY_EXCHANGE, DELAY_ROUTING_KEY, null);}}

生产者

发送消息时,指定延迟的毫秒

/*** 延迟队列发送者*/
@Component
@Slf4j
public class DelayQueueSender {@Autowiredprivate RabbitTemplate rabbitTemplate;public void sendDelayQueue(int number) {log.warn("延迟队列发送 : {} milliseconds", number);// 这里的Exchange可以是业务的Exchange,为了方便测试这里直接往死信Exchange里投递消息
        rabbitTemplate.convertAndSend(DelayQueueConfig.DELAY_EXCHANGE,DelayQueueConfig.DELAY_ROUTING_KEY,number, (message) -> {// 设置延迟的毫秒数message.getMessageProperties().setDelay(number);log.info("Now : {}", ZonedDateTime.now());return message;});}
}

消费者

/*** 延迟队列消费者*/
@Component
@Slf4j
@RabbitListener(queues = DelayQueueConfig.DELAY_QUEUE)
public class DelayQueueConsumer {@RabbitHandlerpublic void receiveDelayMessage(Integer milliseconds){log.warn("DelayQueueConsumer Time : {}, and the millis : {}", ZonedDateTime.now(), milliseconds);}}

测试

先启动项目;

然后在测试类中发送消息;

@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitmqApplicationTests {@Autowiredprivate DelayQueueSender delayQueueSender;@Testpublic void testDelayQueueSender(){delayQueueSender.sendDelayQueue(5000);}
}

发送消息窗口:

消费者受到消息:

时间间隔证明延迟队列发送完成!

参考:

https://blog.csdn.net/linsongbin1/article/details/80178122

https://blog.csdn.net/youjin/article/details/82586888

https://docs.spring.io/spring-amqp/docs/2.0.0.M2/reference/htmlsingle/#delayed-message-exchange

https://www.rabbitmq.com/blog/2015/04/16/scheduling-messages-with-rabbitmq/

转载于:https://www.cnblogs.com/theRhyme/p/10986409.html

SpringBoot RabbitMQ 延迟队列代码实现相关推荐

  1. RabbitMQ 延迟队列-对于入门来说可以快速上手

    RabbitMQ 延迟队列-非常非常实用 RabbitMQ 延迟队列-非常非常实用 一.使用场景 二.消息延迟推送的实现 三.项目具体实现 RabbitMQ 延迟队列-非常非常实用 一.使用场景 ​ ...

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

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

  3. rabbitmq 延迟队列_Delayed Message 插件实现 RabbitMQ 延迟队列

    延迟队列是为了存放那些延迟执行的消息,待消息过期之后消费端从队列里拿出来执行. DLX + TTL 方式存在的时序问题 对于延迟队列不管是 AMQP 协议或者 RabbitMQ 本身是不支持的,之前有 ...

  4. Delayed Message 插件实现 RabbitMQ 延迟队列

    延迟队列是为了存放那些延迟执行的消息,待消息过期之后消费端从队列里拿出来执行. DLX + TTL 方式存在的时序问题 对于延迟队列不管是 AMQP 协议或者 RabbitMQ 本身是不支持的,之前有 ...

  5. 谷粒商城笔记+踩坑(22)——库存自动解锁。RabbitMQ延迟队列

    导航: 谷粒商城笔记+踩坑汇总篇 目录 1 业务流程,订单失败后自动回滚解锁库存 可靠消息+最终一致性方案 2[仓库服务]RabbitMQ环境准备 2.1 导入依赖 2.2 yml配置RabbitMQ ...

  6. RabbitMQ 延迟队列详解

    一.延迟队列概念 延迟队列存储的对象是对应的延迟消息,所谓"延迟消息"是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费. 二.延 ...

  7. RabbitMQ 延迟队列,太实用了!

    点击关注公众号,Java干货及时送达 目前常见的应用软件都有消息的延迟推送的影子,应用也极为广泛,例如: 淘宝七天自动确认收货.在我们签收商品后,物流系统会在七天后延时发送一个消息给支付系统,通知支付 ...

  8. RabbitMQ(九):RabbitMQ 延迟队列,消息延迟推送(Spring boot 版)

    应用场景 目前常见的应用软件都有消息的延迟推送的影子,应用也极为广泛,例如: 淘宝七天自动确认收货.在我们签收商品后,物流系统会在七天后延时发送一个消息给支付系统,通知支付系统将款打给商家,这个过程持 ...

  9. C#实现rabbitmq 延迟队列功能

    最近在研究rabbitmq,项目中有这样一个场景:在用户要支付订单的时候,如果超过30分钟未支付,会把订单关掉.当然我们可以做一个定时任务,每个一段时间来扫描未支付的订单,如果该订单超过支付时间就关闭 ...

最新文章

  1. CocoaPods 引用第三方库导致的模拟器可以运行,但是真机不可以运行问题。
  2. pandas中的sample方法
  3. pt-online-schema-change 在线修改表结构
  4. 贴吧用html标签,html标签3(转载)
  5. About UserAccountControl
  6. SQL中关于where后面不能放聚合函数(如sum等)的解决办法
  7. php array walk recursive,php中如何使用array_walk_recursive?
  8. 【GitHub通过ssh方法下载详细配置过程】
  9. STM32H7+LAN8720A之ETH与LWIP配置问题(End)
  10. MBE风格图标3步速学教程
  11. matplotlib柱状图给指定的柱换颜色_matplotlib绘图基本操作amp;美化教程
  12. mysql登录密码mysql重置root密码
  13. 斑马网络招聘汽车安全软件工程师
  14. ArcMap对多年 NDVI 进行线性趋势和F显著性检验
  15. mysql binlog 回滚_【MySQL】Mysql误操作后使用binlog2sql快速回滚
  16. 如何使用计算机还原魔方?
  17. 浅谈微博、微信公众号、今日头条三者的区别
  18. java 制作甘特图,看我如何用简单的步骤打造出复杂的web甘特图
  19. springboot无法打开 jsp 页面变成下载解决办法
  20. ubuntu 18.04 识别不到有线网卡

热门文章

  1. 经验总结02-sql语句
  2. Firefox v5 正式版
  3. CLR via C# 读书笔记 1-2 创建线程的成本
  4. Perl 变量(1)--纯变量
  5. C语言之计算大数阶乘,如计算100!和1000!等~~~
  6. Labview-浅谈Labview中VISA的设计
  7. spring 可以有多个ioc容器吗
  8. 047_Object对象
  9. 虚拟机linux配置armip,arm-PC-虚拟机环境搭建
  10. mysql 2006测试_狂神说MySQL06:事务和索引