1.DelayQueue能做什么?
在我们的业务中通常会有一些需求是这样的:
- 淘宝订单业务:下单之后如果三十分钟之内没有付款就自动取消订单。
- 饿了吗订餐通知:下单成功后60s之后给用户发送短信通知。
那么这类业务我们可以总结出一个特点: 需要延迟工作 。
由此的情况,就是我们的DelayQueue应用需求的产生。
2.使用DelayQueue延迟队列实现订单的具体操作
-
用户取消支付或支付异常后,把订单ID插入到内存的一个DelayQueue中,同时插入到Redis中。
-
在规定时间内,用户再次进行支付,且支付成功,则从DelayQueue中删除,从Redis中删除。
-
超过规定时间,DelayQueue中的订单ID出队,查询数据库,改关闭状态为异常,删除过期redis。
-
如果在规定时间之内,web服务器重启过,则web服务器启动以后,从redis中读取待付款的订单,插入到DelayQueue
3.代码实现
监听器监听ioc容器中bean的初始化,使用多线程不断的从队列中拿出过期元素,并做相应处理。
假如系统宕机,我们会从redies中拿出还未过期的元素,并加入到队列中。


测试支付失败,将未支付的订单插入到延迟队列中,和写入redis中,等待过期时间,打印相应的日志信息

网友评论