(三)延迟队列DelayQueue实现订单自动取消

Python018

(三)延迟队列DelayQueue实现订单自动取消,第1张

DelayQueue :,1)java自带延时获取元素, 无界 阻塞队列,2)队列 内部用PriorityQueue实现 。     创建元素时可 指定多久 才能从队列中获取当前元素。期满才从队列中 提取 ,没到延时时间, 阻塞 当前线程。

泛型队列,继承Delayed,需重写getDelay和compareTo方法。

1.public class DelayQueue <E extends Delayed >extends AbstractQueue <E>

2.public int compareTo (T o)往DelayQueue 加入数据 执行,根据返回值判断位置。排得越 前,越先被消费

3. long getDelay (TimeUnit unit)判断消息是否到期。负数,已到期,可读。

优点: java自带,轻量级,使用简单

缺点: 存储 内存中 ,服务器 重启 会造成数据 丢失 ,配合redis使用。数量大用mq

订单类,实现Delayed接口

unit.convert(this.createdTime.toInstant(ZoneOffset.of("+8")).toEpochMilli()+expireTime-System.currentTimeMillis(),TimeUnit.MILLISECONDS)

DelayQueue 分布式 环境中就会 重复执行;所以加redis:

每次生成订单时, 同时向 redis setnx 设定该未支付订单,

每次查询待支付订单时须从 redis 中也查一遍,

redis 不存在该订单,改为已取消。

AB 两个队列,A 队列设置 消息过期时间 , 没有消费者 ,A 过期自动转发到 B , B 队列消费者 取消 。

https://www.jianshu.com/p/2ef8646fe8f7

https://www.v2ex.com/amp/t/407801

12小时,ApacheActiveMQ是Apache软件基金会所研发的开放源代码消息中间件,延时队列可以支持12小时,由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。