业务场景:
1、生成订单30分钟未支付,则自动取消,我们该怎么实现呢?
2、生成订单60秒后,给用户发短信
延时任务和定时任务的区别:
- 定时任务有明确的触发时间,延时任务没有;
- 定时任务有执行周期,而延时任务在某事件触发后一段时间内执行,没有执行周期;
- 定时任务一般执行的是批处理操作是多个任务,而延时任务一般是单个任务。
实现方案:
1、JDK的延迟队列
利用JDK自带的DelayQueue来实现,这是一个无界阻塞队列,该队列只有在延迟期满的时候才能从中获取元素,放入DelayQueue中的对象,是必须实现Delayed接口的。
Poll():获取并移除队列的超时元素,没有则返回空。
take():获取并移除队列的超时元素,如果没有则wait当前线程,直到有元素满足超时条件,返回结果。
1.1 实现
定义一个类(IPBlockingDelayWeek)实现Delayed:
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
public class IPBlockingDelayWeek implements Delayed {
private IPBlockingVo ipBlockingVo;
private long timeout;
public IPBlockingDelayWeek(IPBlockingVo ipBlockingVo, long timeout) {
this.ipBlockingVo = ipBlockingVo;
this.timeout = timeout + System.nanoTime();
}
// 返回距离你自定义的超时时间还有多少
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(timeout - System.nanoTime(), TimeUnit.NANOSECONDS);
}
@Override
public int compareTo(Delayed other) {
if (other == this) {
return 0;
}
IPBlockingDelayWeek t = (IPBlockingDelayWeek) other;