用戶在购买商品的时候通常会预购然后没付款,没付款的订单通常会被设置一个自动超时时间如30分钟后超时,所以我们要在订单到30分钟后自动将超时的订单取消。
JUC(DelayQueue)方案#
DelayQueue简介
DelayQueue是java并发包下的延时阻塞队列,常用于实现定时任务。
DelayQueue是一个支持延时获取元素的无界阻塞队列。里面的元素全部都是“可延期”的元素,列头的元素是最先“到期”的元素,如果队列里面没有元素到期,是不能从列头获取元素的,哪怕有元素也不行。也就是说只有在延迟期到时才能够从队列中取元素。
DelayQueue主要用于两个方面:-缓存:清掉缓存中超时的缓存数据-任务超时处理
DelayQueue实现了BlockingQueue,所以它是一个阻塞队列。
DelayQueue还组合了一个叫做Delayed的接口,DelayQueue中存储的所有元素必须实现Delayed接口。
JUCDelayQueue实现订单超时案例代码案例代码
定义订单超时对象:
Copy/***juc定义延迟对象信息*
authorwuwentao*/DatapublicclassOrderimplementsDelayed{publicOrder(StringorderId,longsecond){this.orderId=orderId;second=second*;this.timeout=System.currentTimeMillis()+second;}privateStringorderId;//订单号privatelongtimeout;//具体的超时时间/***延迟任务会自动调用该方法如果是负数则说明对象到了时间*/OverridepubliclonggetDelay(TimeUnitunit){returnthis.timeout-System.currentTimeMillis();}/***定义排序规则*/Overridepublicint