什么是定时任务
通过时间表达式来进行调度和执行的一类任务被称为定时任务。一般能解决的业务场景:定时对账、服务到期的定时提醒、订单超时未支付的自动取消等。
有哪些定时任务实现方案
单体架构调度技术
- 轮询+线程休眠
while(true) + Thread.sleep
- java.util.Timer + java.util.TimerTask
Timer是一个定时器工具,用来在一个后台线程计划执行指定任务,它可以计划执行一个任务或反复多次
TimerTask是一个抽象类,它的子类代表一个可以被Timer计划执行的任务
- ScheduledExecutorService
JDK1.5之后作为并发工具被引入,默认只支持周期性的执行频率(如每秒/每分钟),要支持具体某一刻年月日时分秒的执行窗口需要自定义扩展,较麻烦
- Quartz
开源任务调度框架,Java语言编写实现,支持Spring整合使用
- SpringTask
spring框架提供的轻量级定时任务调用工具
SpringBoot框架下可使用注解:@EnableScheduling+@Scheduled,底层还是SpringTask
分布式架构调度技术
分布式场景可能遇到的问题
- 多台机器集群部署的定时任务如何保证不被重复执行
- 如果在不重启服务前提下,动态调整定时任务执行时间
- 部署定时任务的机器发生故障如何故障转移
- 如何对定时任务做任务监控
业界解决方案
- 淘宝:TBSchedule,现在是:ScheduleX
- 当当:Elastic-Job
- 唯品会:Saturn,基于当当的二次开发,新增一些特性
- 大众点评:XXL-JOB