1.创建能在DelayQueue中存放的Order对象

package com.example.javastudy.delay_queue;import java.time.Duration;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;public class Order implements  Delayed {private Long createTime;private String number;private Duration duration;public Order(Long createTime, String number, Duration duration) {this.createTime = createTime;this.number = number;this.duration = duration;}//take()方法判断是否可以出队@Overridepublic long getDelay(TimeUnit unit) {return unit.convert(( createTime + duration.toMillis() - System.currentTimeMillis()),TimeUnit.MILLISECONDS);}@Overridepublic int compareTo(Delayed o) {if(this == o){return 0;}if(o instanceof Order){Order target = (Order) o;return createTime.compareTo(target.createTime);}else {long gap = getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS);return gap == 0 ? 0 : (gap < 0 ? -1:1);}}public Long getCreateTime() {return createTime;}public void setCreateTime(Long createTime) {this.createTime = createTime;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public Duration getDuration() {return duration;}public void setDuration(Duration duration) {this.duration = duration;}
}

2.订单业务

public class OrderService {public final BlockingQueue<Order> queue = new DelayQueue<>();private final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1,2,0, TimeUnit.MILLISECONDS,new LinkedBlockingDeque<>());public void cancelDelayOrder(){threadPool.execute(() ->{for (;;){try {Order order = queue.take();String number = order.getNumber();System.out.println("=============>订单:"+number+"已取消"+"当前系统时间:"+new Date());for (Order next : queue) {System.out.println("=============>订单编号:" + next.getNumber());}} catch (InterruptedException e) {e.printStackTrace();}}});}
}

3.测试类


public class OrderTest {static OrderService orderService = new OrderService();//订单初始化static void initial(){Random random = new Random();for (int i = 0; i < 4; i++) {Order order = new Order(System.currentTimeMillis(),"订单"+(i+1), Duration.ofSeconds(20));orderService.queue.add(order);int randomSleep = random.nextInt(5);System.out.println("=============>订单"+(i+1)+"创建成功,当前时间:"+new Date());try {TimeUnit.SECONDS.sleep(randomSleep);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("=================系统初始化成功");StringBuilder number = new StringBuilder();for (Order order : orderService.queue) {number.append(order.getNumber()).append("|");}System.out.println("=================系统当前订单有:"+number);}public static void main(String[] args) {initial();orderService.cancelDelayOrder();}
}

测试结果可以看出,当订单到达过期时间后订单就被取消了

使用DelayQueue模拟订单超时自动取消相关推荐

  1. delayQueue实现订单超时自动取消

    目录 说明 实现 1.编写Delayed实现类 2.编写DelayQueue业务类 3.编写订单业务逻辑 总结说明 说明 商城系统的订单模块都应该有:订单未支付超时后自动取消订单的操作.我们在开发过程 ...

  2. 订单超时自动取消3种方案——我们用这种!

    大家好,大家对电商购物应该都比较熟悉了,我们应该注意到,在下单之后,通常会有一个倒计时,如果超过支付时间,订单就会被自动取消. 下单 今天,我们来聊聊订单超时未支付自动取消的几种方案. 1.定时任务 ...

  3. Java 实现订单未支付超时自动取消

    在电商上购买商品后,如果在下单而又没有支付的情况下,一般提示30分钟完成支付,否则订单自动.比如在京东下单为完成支付: 超过24小时,就会自动取消订单,下面使用 Java 定时器实现超时取消订单功能. ...

  4. TP6订单待支付超时自动取消

    1:安装redis 2:安装think-queue composer require topthink/think-queue 3:设置配置文件,使用redis进行存储,文件位置config/queu ...

  5. 订单过期 自动取消实现方案

    在电商.支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作,细心的你一定发现了像某宝.某东都有这样的逻辑,而且时间很准确,误差在1s内:那他们是怎么实现的呢 ...

  6. 【Java并发编程】20、DelayQueue实现订单的定时取消

    当订单定时取消需要修改数据库订单状态,但是怎么确定订单什么时候应该改变状态,解决方案有下面两种:  第一种,写个定时器去每分钟扫描数据库,这样更新及时,但是如果数据库数据量大的话,会对数据库造成很大的 ...

  7. java订单到期自动取消_订单自动过期实现方案

    需求分析: 24小时内未支付的订单过期失效. 解决方案 被动设置:在查询订单的时候检查是否过期并设置过期状态. 定时调度:定时器定时查询并过期需要过期的订单. 延时队列:将未支付的订单放入一个延时队列 ...

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

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

  9. DelayQueue延迟任务队列----实现订单超时修改订单状态处理,复制即用

    其实实现这种功能的方式有很多种MQ,Redis,以及DelayQueue,也是比较常见的. 如果完全没啥要求,而且服务器配置又好,也不在乎有没有空隙,那还可以采用定时任务做处理,直接定时刷数据库,但是 ...

最新文章

  1. 如何设置不一样的奇偶页页眉?
  2. #ifndef 与 #program once 的区别
  3. 如何成为SAP行业专家
  4. 前端学习(1708):前端系列javascript之问题解答
  5. Linux内核Crash分析
  6. sql server 迁移 mysql_【转】sql server迁移到mysql
  7. VS Code 的常用快捷键
  8. Java中BigDecimal类介绍及用法
  9. 线性代数学习笔记(二)
  10. UI素材模板|新拟态新趋势图标ICON
  11. linux下c语言创建进程实验报告,linux下的c语言编程实验报告
  12. QT 中控件内坐标转换为父窗口坐标或屏幕坐标
  13. 【数学建模】看了都说好,高温作业专用服装设计拟合函数模型,强烈建议收藏
  14. 【百度之星程序设计大赛】2020年初赛第三场第四题Intersection
  15. Javascript程序运行环境安装
  16. js实现数字转化为大写金额——js技能提升
  17. Python每日一练(7)-图片转字符画
  18. java开源物联网_JetLinks开源物联网平台源码 v1.8.0
  19. 用Python做一个Mean Rerversion策略
  20. 游戏引擎笔记(三)天空盒和水面

热门文章

  1. 重启计算机后回收站,win7右键菜单如何添加清空回收站和重新启动的命令
  2. 05-ES6语法:解构赋值
  3. Python 必知的20个神操作,完美诠释其简洁、优美的初衷(初学者必读)
  4. 非脚手架vue兼容IE和360兼容模式方法
  5. JS:数组的定义及方法
  6. 仿闲鱼验货宝链接源码
  7. 如何在 Mac 和 Windows 上恢复未保存或删除的 PDF
  8. NLP实战:使用机器/深度学习做文本分类
  9. 安全测试工具(持续增加中...)
  10. Server 2008R2更新系统失败,提示8000FFFF的解决方法