在电商上购买商品后,如果在下单而又没有领取的状况下,个别提醒 30 分钟实现领取,否则订单主动。比方在京东下单为实现领取:
超过 24 小时,就会主动勾销订单,上面应用 Java 定时器实现超时勾销订单性能。
- Timer 定时器
Timer 是一个调度工作的执行的工具,工作能够一次性定时执行或者定时反复执行,零碎会启动一个线程来执行所有的定时工作。 - TimerTask 定时工作
TimerTask 是一个抽象类,它实现了 Runnable,实现 Runnable 也就是创立了多线程工作。
创立 TimerTask
TimerTask 是抽象类,形象是为了代码复用,要创立一个类继承 TimerTask:
public class CancelOrderTimeTask extends TimerTask {
private Long id;
public CancelOrderTimeTask(long id) {this.id = id;}
@Override
public void run() {
// 执行勾销订单
cancelOrder(id);
System.out.println(getCurrentTime() + "工夫勾销订单, 订单 id:" + id);
}
private String getCurrentTime() {SimpleDateFormat sdf = new SimpleDateFormat();
sdf.applyPattern("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
return sdf.format(date);
}
}
在 run
办法执行订单勾销工作。
因为这个办法不是创立 bean,所以在调用的 dao 或者其余的 bean 时,要应用
ApplicationContext
获取 bean。
Timer 定时器调用 TimerTask
新建 Timer,应用 schedule 办法调用,办法有两个参数,第一个是工作的实例,另一个是提早多久后调用工作,单位是毫秒。代码如下:
@RestController
public class TimerController {@GetMapping("/timer")
public String timer(long id) {Timer timer = new Timer();
CancelOrderTimeTask timeTask = new CancelOrderTimeTask(id);
System.out.println("以后工夫是" + getCurrentTime());
//10 秒后执行工作
timer.schedule(timeTask,10 * 1000);
return "ok";
}
private String getCurrentTime() {SimpleDateFormat sdf = new SimpleDateFormat();
sdf.applyPattern("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
return sdf.format(date);
}
}
调用办法后,控制台输入如下内容,阐明定时调用胜利。
以后工夫是 2022-01-24 00:05:09
2022-01-24 00:05:19 工夫勾销订单, 订单 id:3
总结
- 首先创立定时工作,继承 TimerTask,在 run 办法外面写业务逻辑。
- 应用 Timer 调用 schedule 办法, schedule 办法写入 TimerTask 实例以及延迟时间。
源码
github 源码
如果感觉文章对你有帮忙的话,请点个赞吧!