一、什么是延迟任务
什么是延迟任务?
12306下单等待支付业务:
定时任务与延迟任务的区别:
定时任务往往是固定周期的,有明确的触发时间。而延迟任务一般没有固定的开始时间,它常常是由一个事件触发的,而在这个事件触发之后的一段时间内触发另一个事件,任务可以立即执行,也可以延迟,任务之间也可以建立一定联系;
场景一: 订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单;如果期间下单成功,任务取消
场景二:接口对接出现网络问题,1分钟后重试,如果失败,2分钟重试,直到出现阈值终止
延迟任务的实现方案:
1:单机版方案:基于jdk中的定时器
2:消息中间件方案
3:自定义分布式延迟任务方案
方案没有好坏之分,和系统架构一样,关键是适合自身业务系统,不过目前IT行业发展阶段,有些市面上开源中间件已经不能满足大厂自身业务,大厂基本都是从新定制开发。
二、延迟任务系统设计
2.1.延迟任务需求分析
延迟任务的概念我们已经阐述,在充吧项目中延迟任务的业务场景有:
场景一: 订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单;如果期间下单成功,任务取消
场景二:接口对接出现网络问题,1分钟后重试,如果失败,2分钟重试,直到出现阈值终止
总结下来:简单的理解延迟任务可以认为是在某个设定的时间之后做某一件事情。
2.2.延迟任务单机版实现方案-Timer定时器
jdk中提供了一个定时器类Timer,它能做到在指定的时间点去执行某一个任务,也能做到定时的周期性的执行某一个任务
1:在src/test/java下创建测试包:com.chongba.schedule.jdk,在测试包下创建测试类TimerTaskTest
[code]public class TimerTaskTest { public static void main(String[] args) { Timer timer = new Timer(); // 1秒之后 执行任务 timer.schedule(new TimerTask() { @Override public void run() { System.out.println(System.currentTimeMillis()/1000+"执行了任务"); } },1000L); System.out.println(System.currentTimeMillis()/1000); //执行时间 |