DelayQueue小结

  • DelayQueue是一个有序的无界BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象在到期时才能从队列中取走。
  • DelayQueue只能添加实现了Delayed接口的对象,不能将null元素放置到这种队列中。

BlockingQueue中add,offer,put方法区别

  • add
    将指定的元素插入到此队列中,在成功时返回 true,如果当前没有可用空间,则抛出 IllegalStateException,该方式为非阻塞添加。
  • offer
    将指定元素插入到此队列的尾部(如果立即可行且不会超出此队列的容量),在成功时返回 true,如果此队列已满,则返回 false,此方法通常要优于 add 方法,该方式为非阻塞添加。
  • put
    将指定元素插入到此队列的尾部,该方式为阻塞添加,则等待空间变得可用。

代码实现

初始化一个延迟队列DelayQueue

/*** 定义一个延迟队列** @author zengwei* @email 1014483974@qq.com*/
public volatile static DelayQueue<Orders> orderQueue = new DelayQueue();

在订单类中,实现Delayed接口

/*** 订单实体类** @author zengwei* @email 1014483974@qq.com*/
@Entity
@Data
@Builder(toBuilder = true)
@EqualsAndHashCode(callSuper = false)
public class Orders implements Delayed {@ApiModelProperty(value = "订单编号")private String orderNumber;@ApiModelProperty(value = "订单自动关闭时间,DelayQueue使用")private Date time;@Overridepublic long getDelay(TimeUnit unit) {return unit.convert(time.getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS);}@Overridepublic int compareTo(Delayed o) {return time.compareTo(((Orders) o).getTime());}}

能日赚30手赚试玩平台,亲测有效

定义一个Job类,实现CommandLineRunner接口,用于在项目启动后执行该任务,通过take()方法从队列中获取到指定对象出列,在执行完任务后,调用remove()方法从队列删除该任务

/*** 延迟队列自动取消订单* * 【能日赚30手赚试玩平台,推荐使用iphone操作】 * 【https://mp.weixin.qq.com/s?__biz=MzIyODgxNjkyOQ==&mid=100000040&idx=1&sn=47c0245f9dbe70f3ad6b2540209af2c2&chksm=684d60665f3ae97095ba07d8c6804bac4f55dbc6e7100fbb233945f65364df88682d41332eb7&xtrack=1&scene=0&subscene=10000&clicktime=1616647421&enterid=1616647421&ascene=7&devicetype=android-29&version=28000165&nettype=WIFI&abtest_cookie=AAACAA%3D%3D&lang=zh_CN&exportkey=AdxLWFyJlgtM6uFZCpgWtBk%3D&pass_ticket=G8rEeGdox4FPpICRkrKy6ho2QZozCzXi%2Be7gV5bXnQaXoZK2pw4S8Wf2j%2Bt3D8mi&wx_header=1】** @author zengwei* @email 1014483974@qq.com*/
@Slf4j
@Component
public class OrderDelayQueueJob implements CommandLineRunner {public void orderTask() {log.info("开启自动取消订单job,当前时间 = {}", new DateTime().toString());while (true) {try {// 获取指定订单信息Orders order = DelayQueueConfig.orderQueue.take();// 从队列中删除该数据DelayQueueConfig.orderQueue.remove(order);log.info("订单" + order.getOrderNumber() + "超时取消,取消时间 = {}", new DateTime().toString());log.info("Initial Size = {}", DelayQueueConfig.orderQueue.size());} catch (InterruptedException e) {break;}}}@Overridepublic void run(String... args) {// 自动取消订单开启ThreadUtil.execute(this::orderTask);}
}

在创建订单的位置,如买家未付款,则将该订单加入DelayQueue延迟队列,指定30s后自动取消订单

/*** 将订单加入延迟队列,30s后自动取消* * 【能日赚30手赚试玩平台,推荐使用iphone操作】 * 【https://mp.weixin.qq.com/s?__biz=MzIyODgxNjkyOQ==&mid=100000040&idx=1&sn=47c0245f9dbe70f3ad6b2540209af2c2&chksm=684d60665f3ae97095ba07d8c6804bac4f55dbc6e7100fbb233945f65364df88682d41332eb7&xtrack=1&scene=0&subscene=10000&clicktime=1616647421&enterid=1616647421&ascene=7&devicetype=android-29&version=28000165&nettype=WIFI&abtest_cookie=AAACAA%3D%3D&lang=zh_CN&exportkey=AdxLWFyJlgtM6uFZCpgWtBk%3D&pass_ticket=G8rEeGdox4FPpICRkrKy6ho2QZozCzXi%2Be7gV5bXnQaXoZK2pw4S8Wf2j%2Bt3D8mi&wx_header=1】* * @author zengwei* @email 1014483974@qq.com*/
Orders orders = Orders.builder().orderNumber(RandomUtil.randomNumbers(10)).time(DateUtil.offset(new Date(), DateField.SECOND, 30)).build();
DelayQueueConfig.orderQueue.add(orders);
log.info("订单" + orders.getOrderNumber() + "未付款,到期时间 = {}",DateUtil.formatDateTime(orders.getTime()));

能日赚30手赚试玩平台,亲测有效

运行程序后创建待支付订单,30s后该订单自动取消,同时从队列中删除,日志中Initial Size = 0,代表队列的长度

在重启服务器后,那些未执行的延迟任务就不存在了,目前我是在项目重启时,定义一个@Component组件,异步去查询未付款的订单,如果已超时,则直接改为已取消;未超时的订单,则加入DelayQueue延迟队列中,持久化方案目前仍在学习中。

未经允许,禁止转载


This work is licensed under a Creative Commons Attribution 4.0 International License.

Springboot使用DelayQueue实现订单自动取消相关推荐

  1. 【项目实战】Redis使用场景之待支付订单自动取消、订单自动收货

    一.使用背景 很多业务场景,例如订单过期自动删除,订单几天后自动好评,这些常用操作可以通过定时任务,数据库轮询做,但是订单量大的情况可能会对数据库产生大的压力. 二.Redis的key过期推送功能原理 ...

  2. 下单后半小时未付款订单自动取消的实现,延迟队列

    下单后半小时未付款订单自动取消的实现,延迟队列 类似的需要: 订单的评论如果7天未评价,系统需要自动产生一条评论 订单的15天之后未点击收货,系统需要自动更改为已收货. ... 因为是需要一个常驻进程 ...

  3. springboot整合RabbitMQ实现延时自动取消订单

    1.pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>s ...

  4. SpringBoot结合RabbitMQ简单实现订单延迟取消

    参考了这位大佬的博客,详细看这里 springboot整合RabbitMQ实现延时自动取消订单 1.导入jar包 <dependency><groupId>org.spring ...

  5. 三小时未付款自动取消订单实现

    电商系统中,有这样的需求,用户下单三小时未支付就自动取消,具体如何实现的呢? 一.实现方案 通常实现方案有以下方式: 方式一 使用定时任务不断轮询取消,此种方式实现简单,但是存在一个问题,定时任务设置 ...

  6. php date 毫秒_swoole+PHP自动取消订单he还原库存

    toujun007 2019-06-27 13:18:57 业务场景 一.业务场景:当客户下单在指定的时间内如果没有付款,那我们需要将这笔订单取消掉,比如好的处理方法是运用延时取消,这里我们用到了sw ...

  7. php自动按天清空库存,swoole+PHP实现自动取消订单,还原库存等操作

    一.业务场景:当客户下单在指定的时间内如果没有付款,那我们需要将这笔订单取消掉,比如好的处理方法是运用延时取消,这里我们用到了swoole,运用swoole的异步毫秒定时器不会影响到当前程序的运行,具 ...

  8. JAVA RedissonClient之自动取消订单

    1.pom.xml文件中引入jar包 <dependency><groupId>org.redisson</groupId><artifactId>re ...

  9. Redis key过期事件监听实现 - 30分钟自动取消未支付订单

    目录 一.前言 二.实现方案分析 三.Redis key过期事件方案实现步骤 3.1 Redis 安装步骤详见 3.2 修改 Redis 配置 3.3 在获取支付链接视图中设置key过期事件 3.4 ...

最新文章

  1. ABP Zero示例项目问题总结
  2. FPGA之道(84)功能仿真之Verilog Test Fixture
  3. Head First C 第八章 静态库与动态库 创建动态库
  4. boost::mpl::less相关的测试程序
  5. cmd下pip安装mysql_pip安装MySQLpython
  6. leetcode - 617. 合并二叉树
  7. Python基础1(2017-07-16)
  8. 各种语言和各种前沿技术的简介和科普
  9. import radom 和import string
  10. 网易云音乐转码_网易云音乐产品分析报告
  11. Python:实现sha256算法(附完整源码)
  12. ipadmini1从9.3.5降级8.4.1最有效的方法
  13. python矩阵连乘_python动态演示动态规划解决矩阵连乘
  14. 我的网关、子网掩码、DNS1、DNS2是什么
  15. 三十种共识算法,直抵背后的灵魂
  16. weblogic反序列化漏洞修复
  17. Qt之Q_OBJECT
  18. 【案例设计】音频可视化 解析与设计
  19. RISC-V E300 SOC架构介绍——1.总体介绍
  20. 【ironic】ironic介绍与原理

热门文章

  1. 互联网时代,有哪些渠道可以推广自己业务/产品信息呢?
  2. root user guide_教你冻结安卓手机自带不用的APP,无需ROOT
  3. 分布式理论梳理——FLP定理
  4. 2022-大脑与认知科学-台湾交通大学-黃植懋
  5. Android 实现蓝牙打印的功能
  6. 计算机应用能力上海海事大学算挂,我校师生在第10届上海市计算机应用能力大赛获佳绩...
  7. 【codevs1700】施工方案第二季 MST+树的重心
  8. Tomcat部署html静态网站的五种方式
  9. glassfish基本配置(转载)
  10. 回归基础:各种排序算法详解