为什么延迟队列(DelayQueue)中的任务不过期呢
最近写后端用延迟队列实现订单支付过期的功能,之前测试的时候一直没有问题,但是就在刚才下了几单等过期的时候发现订单始终没有过期(过期时间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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
DelayQueue
是到了时间才能获取,延迟获取队列,不是用来处理过期的。你这种用本地缓存 或者自己加个ttl字段都可以。看起来像是没有及时消费队列内的任务消息,你尝试看看消费逻辑日志之类的,看看是不是消费逻辑那块卡住了或者什么,光这样看不出来啥