java控制订单过期时间 |
您所在的位置:网站首页 › 美团下单自动取消 › java控制订单过期时间 |
需求分析:24小时内未支付的订单过期失效。 解决方案被动设置:在查询订单的时候检查是否过期并设置过期状态。 定时调度:定时器定时查询并过期需要过期的订单。 延时队列:将未支付的订单放入一个延时队列中,依次取出过期订单。 过期提醒:reids支持将一个过期的key(订单号)通知给客户端,根据过期的订单号进行相应的处理。 1. 被动设置 这个太简单了,就是在查询的时候判断是否失效,如果失效了就给他设置失效状态。但是弊端也很明显,每次查询都要对未失效的订单做判断,如果用户不查询,订单就不失效,那么如果有类似统计失效状态个数的功能,将会受到影响,所以只能适用于简单独立的场景。简直low爆了。 2. 定时调度 这种是常见的方法,利用一个定时器,在设置的周期内轮询检查并处理需要过期的订单。 具体实现有基于Timer的,有基于Quartz,还有springboot自带的Scheduler,实现起来比较简单。 就写一下第三个的实现方法吧:启动类加上注解@EnableScheduling 新建一个定时调度类,方法上加上@Scheduled注解,如下图那么简单。 弊端不能够精准的去处理过期订单,轮询周期设置的越小,精准度越高,但是项目的压力越大,我们上一个项目就有这种状况,太多定时器在跑,项目运行起来比较笨重。 3. 延时队列 基于JDK的实现方法,将未支付的订单放到一个有序的队列中,程序会自动依次取出过期的订单。 如果当前没有过期的订单,就会阻塞,直至有过期的订单。由于每次只处理过期的订单,并且处理的时间也很精准,不存在定时调度方案的那两个弊端。 实现: 1.首先创建一个订单类OrderDelayDto需要实现Delayed接口。然后重写getDelay()方法和compareTo()方法,只加了订单编号和过期时间两个属性。 这两个方法很重要, getDelay()方法实现过期的策略,比如,订单的过期时间等于当前时间就是过期,返回负数就代表需要处理。否则不处理。 compareTo()方法实现订单在队列中的排序规则,这样即使后面加入的订单,也能加入到排序中,我这里写的规则是按照过期时间排序,最先过期的排到最前面,这一点很重要,因为排在最前面的如果没有被处理, |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |