层次 | 举例 | 特点 |
---|---|---|
操作系统 | Linux crontab Windows 计划任务 | 只能执行简单脚本或者命令 |
数据库 | MySQL、Oracle | 可以操作数据。不能执行Java 代码 |
工具 | Kettle | 可以操作数据,执行脚本。没有集中配置 |
开发语言 | JDK Timer、ScheduledThreadPool | Timer:单线程 JDK1.5 之后:ScheduledThreadPool(Cache、Fiexed、 Single):没有集中配置,日程管理不够灵活 |
容器 | Spring Task、@Scheduled | 不支持集群 |
分布式框架 | 分布式框架XXL-JOB,Elastic-Job |
@Scheduled也是用 JUC的 ScheduledExecutorService实现的 Scheduled(cron = “0 15 10 15 * ?”)
1、 ScheduledAnnotationBeanPostProcessor的 postProcessAfterInitialization方法将@Scheduled的方法包装为指定的 task添加到 ScheduledTaskRegistrar中
2、 ScheduledAnnotationBeanPostProcessor会监听 Spring的容器初始化事件,在 Spring容器初始化完成后进行 TaskScheduler实现类实例的查找,若发现有 SchedulingConfigurer的实现类实例,则跳过 3
3、查找 TaskScheduler的实现类实例默认是通过类型查找,若有多个实现则会查找名字为 "taskScheduler"的实现 Bean,若没有找到则在 ScheduledTaskRegistrar调度任务的时候会创建一个 newSingleThreadScheduledExecutor,将 TaskScheduler的实现类实例设置到 ScheduledTaskRegistrar属性中
4、 ScheduledTaskRegistrar的 scheduleTasks方法触发任务调度
5、真正调度任务的类是 TaskScheduler实现类中的 ScheduledExecutorService,由 J.U.C提供