简介

  • 什么是延时队列?

    • 一种带有延迟功能的消息队列

过程:

  • 使用场景

    • 比如存在某个业务场景

      • 发起一个订单,但是处于未支付的状态?如何及时的关闭订单并退还库存?
      • 如何定期检查处于退款订单是否已经成功退款?
    • 为了解决上述的场景,就可以通过延时队列去处理
  • 简单实现
  1. /**
  2. * rabbitTemplate
  3. */
  4. @Autowired
  5. private RabbitTemplate rabbitTemplate;
  6. /**
  7. * rabbitAdmin
  8. */
  9. @Autowired
  10. private RabbitAdmin rabbitAdmin;
  11. /**
  12. * messageProperties
  13. */
  14. @Autowired
  15. private MessageProperties messageProperties;
  16. /**
  17. * 发送延迟队列消息
  18. *
  19. * @param exchange
  20. * @param content
  21. * @param millseconds
  22. */
  23. public void delayPublish(String exchange, String content, int millseconds) {
  24. String delayExchangeName = exchange + "_delay";
  25. String delayQueueName = delayExchangeName + "->queue_delay";
  26. String delayRouteKey = "dead";
  27. Map<String, Object> arguments = new HashMap<>();
  28. arguments.putIfAbsent("x-dead-letter-exchange", exchange);
  29. declareExchange(exchange);
  30. declareExchange(delayExchangeName);
  31. rabbitAdmin.declareQueue(new Queue(delayQueueName, true, false, false, arguments));
  32. rabbitAdmin.declareBinding(new Binding(delayQueueName, Binding.DestinationType.QUEUE, delayExchangeName,
  33. delayRouteKey, Collections.emptyMap()));
  34. MessageProperties messageProperties = getMessageProperties(Collections.emptyMap());
  35. messageProperties.setExpiration(Integer.toString(millseconds));
  36. publish(delayExchangeName, content, messageProperties);
  37. }
  38. /**
  39. * sendMessage
  40. *
  41. * @param exchange
  42. * @param content
  43. * @param messageProperties
  44. */
  45. private void publish(String exchange, String content, MessageProperties messageProperties) {
  46. declareExchange(exchange);
  47. Message message = new Message(content.getBytes(StandardCharsets.UTF_8), messageProperties);
  48. try {
  49. rabbitTemplate.send(exchange, "", message);
  50. log.debug("推送给exchange:{},消息体:{} 成功", exchange, content);
  51. } catch (Exception e) {
  52. log.error("推送给exchange:{},消息体:{} 失败!!", exchange, content, e);
  53. throw e;
  54. }
  55. }
  56. /**
  57. * declareExchange
  58. *
  59. * @param exchange
  60. */
  61. private void declareExchange(String exchange) {
  62. rabbitAdmin.declareExchange(new FanoutExchange(exchange, true, false, null));
  63. }
  64. /**
  65. * getMessageProperties
  66. *
  67. * @param header
  68. * @return
  69. */
  70. private MessageProperties getMessageProperties(Map<String, String> header) {
  71. if (header == null) {
  72. return this.messageProperties;
  73. }
  74. MessageProperties customMessageProperties = new MessageProperties();
  75. customMessageProperties.setDeliveryMode(MessageDeliveryMode.PERSISTENT);
  76. customMessageProperties.setHeader("content_encoding", "JSON");
  77. for (Map.Entry<String, String> item : header.entrySet()) {
  78. customMessageProperties.setHeader(item.getKey(), item.getValue());
  79. }
  80. return customMessageProperties;
  81. }
  • 通过上述代码就可以实现一个简单的延时队列消息的发布
  • 那么只需要进行对应的监听便可以进行消费,达到延时队列的发布及消费的功能

【日常摘要】- RabbitMq实现延时队列的更多相关文章

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

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

  2. rabbitMq实现延时队列

    原文:https://my.oschina.net/u/3266761/blog/1926588 rabbitMq是受欢迎的消息中间件之一,相比其他的消息中间件,具有高并发的特性(天生具备高并发高可用 ...

  3. RabbitMq 实现延时队列-Springboot版本

    rabbitmq本身没有实现延时队列,但是可以通过死信队列机制,自己实现延时队列: 原理:当队列中的消息超时成为死信后,会把消息死信重新发送到配置好的交换机中,然后分发到真实的消费队列: 步骤: 1. ...

  4. rabbitmq实现延时队列(死信队列)

    基于队列和基于消息的TTL TTL是time to live 的简称,顾名思义指的是消息的存活时间.rabbitMq可以从两种维度设置消息过期时间,分别是队列和消息本身. 队列消息过期时间-Per-Q ...

  5. Rabbitmq的延时队列的使用

    配置: spring: rabbitmq: addresses: connection-timeout: username: guest password: guest publisher-confi ...

  6. RabbitMQ及延时队列

    一.简介 我用过RabbirMQ的发布订阅模式,以及一对一的延迟队列. 1.RabbitMQ的有消息确认机制,消费一条则队列中少一条,也有对应的消费到消息及认为是消费成功这样的模式,一般使用前者. 发 ...

  7. rabbitmq 安装延时队列插件rabbitmq-delayed-message-exchange

    1.下载rabbitmq-delayed-message-exchange(注意版本对应) 链接:https://github.com/rabbitmq/rabbitmq-delayed-messag ...

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

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

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

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

随机推荐

  1. JUnit单元测试%MODULE_WORKING_DIR%' does not exist

    解决办法: idea > Run -> Edit Configurations>JUnit(或者application,根据自己报错的类型选择)>单独设置:选中有单元测试的类 ...

  2. 黎活明8天快速掌握android视频教程--18_在SQLite中使用事务

    1 所谓的事业就是一系列的操作 比如:执行转账操作:将personid=1的账户转账10元到personid=2的账号中 所以的一系列操作就是:personid=1的账户钱要减少10元 personi ...

  3. mysql 出现You can't specify target table for update in FROM clause错误的解决方法

    mysql出现You can’t specify target table for update in FROM clause 这个错误的意思是不能在同一个sql语句中,先select同一个表的某些值 ...

  4. 5、struct2使用登陆的时候重定向功能,如果没有登陆,重定向到登陆页面

    1.实现这样一份功能,列如用户在进行某些操作的时候,如果没有登陆重定向到登陆页面 首先:我们创建一个功能操作页面,用户准备在该页面执行某些操作 在index.jsp中 <%@ page lang ...

  5. Python3-pymysql模块-数据库操作之MySQL

    博客转载 http://www.cnblogs.com/alex3714/articles/5950372.html 代码示例 import pymysql conn = None cursor = ...

  6. python 异常类型大全

    try except 处理异常真舒服!!!

  7. Java工具类——数学相关的类

    Java工具类--数学相关的类 在上一篇文章中,我们系统学习了 Java 里面的包装类,那么这篇文章,我们就来学习一下Java提供好的类--数学相关的类. 一.数学类介绍 在最早期学习 Java 基础 ...

  8. Ribbon软负载 (F版)

    Spring Cloud 为开发者提供了在分布式系统中的一些常用的组件(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁定,决策竞选,分布式会话集群状态).使用Sprin ...

  9. Flutter轮播图

    前端开发当中最有意思的就是实现动画特效,Flutter提供的各种动画组件可以方便实现各种动画效果.Flutter中的动画组件主要分为两类: 隐式动画控件:只需设置组件开始值,结束值,执行时间,比如An ...

  10. 关于npm和yarn 安装vue脚手架

    第一篇博客有点小紧张.轻喷~ 第一步:安装node.js       地址 --------https://nodejs.org/en/ 详细步骤这里就不写了    可以去看     地址 ----- ...