一、时间轮
二、定时任务方案
1、
while(true) + Thread.sleep
轮询 + 线程休眠的方式实现定时任务
2、
java.util.Timer + java.util.TimerTask
Timer 是一种定时任务工具,用来在一个后台线程计划执行指定任务,他可以计划执行一个任务一次或反复多次。
TimeTask 是一个抽象类,它的子类代表一个可以被 Timer 计划的任务。
3、ScheduledExecutorService
是从 jdk1.5 开始作为开发工具类被引入。
4、Quartz
开源的定时任务调度框架
5、
@EnableScheduling + @Scheduled
Springboot 注解实现的,底层采用 Spring Task
三、分布式任务调度
分布式集群的模式下,如果采用集中式(单机)的任务调度方式,会带来一些问题:
1、集群部署的定时任务如何保证不被重复执行
2、如何动态调整定时任务的执行时间(不重启服务的情况)
3、部署定时任务的及其故障如何实现故障转移?
4、如何对定时任务进行监控
5、业务量较大,单机性能瓶颈问题,如何扩展?
集中式的定时任务对于上述的问题有一些解决方式
1、数据库唯一约束,保证任务不重复执行(多服务同时执行同一定时任务时,去数据库存储一个存在唯一约束的字段的相同值,插入成功则执行定时任务,插入失败则不执行)
2、使用配置文件、redis、mysql 作为调度的开关
3、使用分布式锁实现调度的控制(拿到锁能调度)
4、使用分布式任务调度平台 TBSchedule、Elastric-job、Saturn、xxl-job 等
xxl-job
美团-许雪里开发