泛型队列,继承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便可执行。