任务调度工具对比
| 操作系統(tǒng) | Linux crontab Windows 計(jì)劃任務(wù) | 只能執(zhí)行簡(jiǎn)單腳本或者命令 |
| 數(shù)據(jù)庫(kù) | MySQL、Oracle | 可以操作數(shù)據(jù)。不能執(zhí)行Java 代碼 |
| 工具 | Kettle | 可以操作數(shù)據(jù),執(zhí)行腳本。沒(méi)有集中配置 |
| 開(kāi)發(fā)語(yǔ)言 | JDK Timer、ScheduledThreadPool | Timer:單線程 JDK1.5 之后:ScheduledThreadPool(Cache、Fiexed、 Single):沒(méi)有集中配置,日程管理不夠靈活 |
| 容器 | Spring Task、@Scheduled | 不支持集群 |
| 分布式框架 | 分布式框架XXL-JOB,Elastic-Job | ? |
@Scheduled也是用 JUC的 ScheduledExecutorService實(shí)現(xiàn)的 Scheduled(cron = “0 15 10 15 * ?”)?
1、 ScheduledAnnotationBeanPostProcessor的 postProcessAfterInitialization方法將@Scheduled的方法包裝為指定的 task添加到 ScheduledTaskRegistrar中?
2、 ScheduledAnnotationBeanPostProcessor會(huì)監(jiān)聽(tīng) Spring的容器初始化事件,在 Spring容器初始化完成后進(jìn)行 TaskScheduler實(shí)現(xiàn)類(lèi)實(shí)例的查找,若發(fā)現(xiàn)有 SchedulingConfigurer的實(shí)現(xiàn)類(lèi)實(shí)例,則跳過(guò) 3?
3、查找 TaskScheduler的實(shí)現(xiàn)類(lèi)實(shí)例默認(rèn)是通過(guò)類(lèi)型查找,若有多個(gè)實(shí)現(xiàn)則會(huì)查找名字為 "taskScheduler"的實(shí)現(xiàn) Bean,若沒(méi)有找到則在 ScheduledTaskRegistrar調(diào)度任務(wù)的時(shí)候會(huì)創(chuàng)建一個(gè)?newSingleThreadScheduledExecutor,將 TaskScheduler的實(shí)現(xiàn)類(lèi)實(shí)例設(shè)置到 ScheduledTaskRegistrar屬性中?
4、 ScheduledTaskRegistrar的 scheduleTasks方法觸發(fā)任務(wù)調(diào)度?
5、真正調(diào)度任務(wù)的類(lèi)是 TaskScheduler實(shí)現(xiàn)類(lèi)中的 ScheduledExecutorService,由 J.U.C提供?
?
總結(jié)
- 上一篇: 任务调度需求分析
- 下一篇: 任务调度框架Quartz基本介绍