Springboot使用DelayQueue实现订单自动取消

DelayQueue小结

DelayQueue是一个有序的无界BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象在到期时才能从队列中取走。 DelayQueue只能添加实现了Delayed接口的对象,不能将null元素放置到这种队列中。

BlockingQueue中add,offer,put方法区别

    add 将指定的元素插入到此队列中,在成功时返回 true,如果当前没有可用空间,则抛出 IllegalStateException,该方式为非阻塞添加。 offer 将指定元素插入到此队列的尾部(如果立即可行且不会超出此队列的容量),在成功时返回 true,如果此队列已满,则返回 false,此方法通常要优于 add 方法,该方式为非阻塞添加。 put 将指定元素插入到此队列的尾部,该方式为阻塞添加,则等待空间变得可用。

代码实现

初始化一个延迟队列DelayQueue

在订单类中,实现Delayed接口

定义一个Job类,实现CommandLineRunner接口,用于在项目启动后执行该任务,通过take()方法从队列中获取到指定对象出列,在执行完任务后,调用remove()方法从队列删除该任务

在创建订单的位置,如买家未付款,则将该订单加入DelayQueue延迟队列,指定30s后自动取消订单

运行程序后创建待支付订单,30s后该订单自动取消,同时从队列中删除,日志中Initial Size = 0,代表队列的长度 在重启服务器后,那些未执行的延迟任务就不存在了,目前我是在项目重启时,定义一个@Component组件,异步去查询未付款的订单,如果已超时,则直接改为已取消;未超时的订单,则加入DelayQueue延迟队列中,持久化方案目前仍在学习中。

未经允许,禁止转载

This work is licensed under a .

经验分享 程序员 微信小程序 职场和发展