为什么延迟队列(DelayQueue)中的任务不过期呢

发布于 2022-09-13 00:20:02 字数 1070 浏览 13 评论 0

最近写后端用延迟队列实现订单支付过期的功能,之前测试的时候一直没有问题,但是就在刚才下了几单等过期的时候发现订单始终没有过期(过期时间2分钟),后来远程调试发现延迟队列里有三个早已经过期的任务(截图时间18:50),附上Delayed接口实现方法,请问大佬们这是什么原因导致的呢?


expire 时间为 2021-06-23 18:17:33

private final static long DELAY = 2 * 60 * 1000L;

public DelayTask(String payOrderNo, int amount, int unionId, int addressId, String openId, int tmpStock, String orderMsg){
        super();
        //省略
        this.expire = System.currentTimeMillis() + DELAY;
        this.now = new Date();
    }
    public DelayTask(String payOrderNo){
        super();
        //省略
        this.expire = System.currentTimeMillis() + DELAY;
        this.now = new Date();
        
    }


    @Override
    public long getDelay(@NotNull TimeUnit unit) {
        return unit.convert(this.expire - System.currentTimeMillis() , TimeUnit.MILLISECONDS);
    }

    @Override
    public int compareTo(@NotNull Delayed o) {
        return (int) (this.getDelay(TimeUnit.MILLISECONDS) -o.getDelay(TimeUnit.MILLISECONDS));
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一场春暖 2022-09-20 00:20:02

DelayQueue 是到了时间才能获取,延迟获取队列,不是用来处理过期的。你这种用本地缓存 或者自己加个ttl字段都可以。

情徒 2022-09-20 00:20:02

看起来像是没有及时消费队列内的任务消息,你尝试看看消费逻辑日志之类的,看看是不是消费逻辑那块卡住了或者什么,光这样看不出来啥

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文