使用DelayQueue模拟订单超时自动取消
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模拟订单超时自动取消相关推荐
- delayQueue实现订单超时自动取消
目录 说明 实现 1.编写Delayed实现类 2.编写DelayQueue业务类 3.编写订单业务逻辑 总结说明 说明 商城系统的订单模块都应该有:订单未支付超时后自动取消订单的操作.我们在开发过程 ...
- 订单超时自动取消3种方案——我们用这种!
大家好,大家对电商购物应该都比较熟悉了,我们应该注意到,在下单之后,通常会有一个倒计时,如果超过支付时间,订单就会被自动取消. 下单 今天,我们来聊聊订单超时未支付自动取消的几种方案. 1.定时任务 ...
- Java 实现订单未支付超时自动取消
在电商上购买商品后,如果在下单而又没有支付的情况下,一般提示30分钟完成支付,否则订单自动.比如在京东下单为完成支付: 超过24小时,就会自动取消订单,下面使用 Java 定时器实现超时取消订单功能. ...
- TP6订单待支付超时自动取消
1:安装redis 2:安装think-queue composer require topthink/think-queue 3:设置配置文件,使用redis进行存储,文件位置config/queu ...
- 订单过期 自动取消实现方案
在电商.支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作,细心的你一定发现了像某宝.某东都有这样的逻辑,而且时间很准确,误差在1s内:那他们是怎么实现的呢 ...
- 【Java并发编程】20、DelayQueue实现订单的定时取消
当订单定时取消需要修改数据库订单状态,但是怎么确定订单什么时候应该改变状态,解决方案有下面两种: 第一种,写个定时器去每分钟扫描数据库,这样更新及时,但是如果数据库数据量大的话,会对数据库造成很大的 ...
- java订单到期自动取消_订单自动过期实现方案
需求分析: 24小时内未支付的订单过期失效. 解决方案 被动设置:在查询订单的时候检查是否过期并设置过期状态. 定时调度:定时器定时查询并过期需要过期的订单. 延时队列:将未支付的订单放入一个延时队列 ...
- springboot整合RabbitMQ实现延时自动取消订单
1.pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>s ...
- DelayQueue延迟任务队列----实现订单超时修改订单状态处理,复制即用
其实实现这种功能的方式有很多种MQ,Redis,以及DelayQueue,也是比较常见的. 如果完全没啥要求,而且服务器配置又好,也不在乎有没有空隙,那还可以采用定时任务做处理,直接定时刷数据库,但是 ...
最新文章
- 如何设置不一样的奇偶页页眉?
- #ifndef 与 #program once 的区别
- 如何成为SAP行业专家
- 前端学习(1708):前端系列javascript之问题解答
- Linux内核Crash分析
- sql server 迁移 mysql_【转】sql server迁移到mysql
- VS Code 的常用快捷键
- Java中BigDecimal类介绍及用法
- 线性代数学习笔记(二)
- UI素材模板|新拟态新趋势图标ICON
- linux下c语言创建进程实验报告,linux下的c语言编程实验报告
- QT 中控件内坐标转换为父窗口坐标或屏幕坐标
- 【数学建模】看了都说好,高温作业专用服装设计拟合函数模型,强烈建议收藏
- 【百度之星程序设计大赛】2020年初赛第三场第四题Intersection
- Javascript程序运行环境安装
- js实现数字转化为大写金额——js技能提升
- Python每日一练(7)-图片转字符画
- java开源物联网_JetLinks开源物联网平台源码 v1.8.0
- 用Python做一个Mean Rerversion策略
- 游戏引擎笔记(三)天空盒和水面