spring任务调度器ThreadPoolTaskScheduler是在jdk的ScheduledExecutorService基础上作了一些封装,然后提供了额外的一些功能
spring把任务调度器在设计上分成了三种角色
1) 计划管理者
2) 任务执行者
3)对任务执行和调度的支持和辅助角色
计划管理者
抽像接口是TaskScheduler
这个接口的抽像功能是提供注册任务计划的接口,它管理这些计划任务,并不会去执行它,TaskScheduler将任务交由任务执行者这个角色来执行这些任务
它提供的接口主要分四类:
1)ScheduledFuture schedule(Runable/callable,时间类型的参数);
指定开始执行的时间或者延时时间,时间到了就执行,只执行一次
2)ScheduledFuture scheduleAtFixedRate(Runable/callable,时间间隔,开始时间);
定时执行,下次执行时间是此次开始执行时间+间隔时间
3)ScheduledFuture scheduleWithFixedDelay(Runable/callable,时间间隔,开始时间);
定时执行,下次执行时间是此次执行完成时间+间隔时间
4)ScheduledFuture schedule(Runable/callable,Trigger);
定时执行,在任务提交和执行后都会调用一次Trigger的nextExecutionTime方法,取得下一次执行时间,我们可以重写 nextExecutionTime方法自由控制每一次任务执行的时间
1、2、3类接口方法跟jdk原生scheduler service提供的方法基本一致,第四种是spring自己的封装
任务执行者
顶层抽像接口 Executor
这是jdk的原生接口,只有一个方法execute(runnable)
继承关系
Executor --接口
TaskExecutor --接口,没有新增任何方法
AsyncTaskExecutor --接口,增加返回future的方法,能通过future操作执行的任务
SchedulingTaskExecutor --接口,增加 boolean prefersShortLivedTasks()方法,仅提示作用,返回ture表是偏向执行短期任务
AsyncListenableTaskExecutor --接口,增加返回ListenableFuture的方法,当任务执行完成或者异常退出后会调用ListenableFuture里面的callBack对像, 执行里面的onSuccess或者onFailure方法,当我们有需求要在任务完成时做一些操作的时候可以使用这个接口的方法
对任务执行和调度的支持和辅助角色
ExecutorConfigurationSupport 抽像类,实现了spring的BeanNameAware, InitializingBean, DisposableBean接口,进行一些初始化、销毁时的一些操作
继承关系
ThreadFactory --线程工厂类,newThread方法
CustomizableThreadCreator --线程创建类,承担新建线程的工作
CustomizableThreadFactory --因为继承了CustomizableThreadCreator,ThreadFactory的newThread方法使用它来新建线程
ExecutorConfigurationSupport,抽像类,对CustomizableThreadFactory作进一步封装,增加了线程池属性和一些相关方法,新建的线程都丢到线程池里面运行,提供的抽像方法initializeExecutor,要求返回一个线程池,新建什么样的线程池由子类决定,ThreadPoolTaskScheduler在实现这个方法的时候是返回的jdk的 ScheduledThreadPoolExecutor线程池。
ThreadPoolTaskScheduler继承关系
ExecutorConfigurationSupport --线程池支持
AsyncListenableTaskExecutor --支持完成或异常自定义操作的执行者
SchedulingTaskExecutor --任务执行者
TaskScheduler --计划管理者(计划表)
ThreadPoolTaskScheduler
从继承关系可以看得出ThreadPoolTaskScheduler担任了以上的所有角色,它能管理和调度计划任务,并把他们丢到自己的线程池中执行,也能通过返回的ScheduledFuture 和ListenableFuture对提交和执行的任务进行跟踪可管理,实现了支持计划任务的线程池
与jdk原生的ScheduledExecutorService计划任务线程池相比,spring扩展了两个功能:
1)支持通过Trigger去提交计划任务, 常用的实现类有
PeriodicTrigger 和scheduleWithFixedDelay提交的任务功能差不多,间隔执行
CronTrigger 支持cron表达式配置执行时间
2) 提供了返回ListenableFuture的接口,可以更好的在任务执行完成或异常时衔接业务,而不用在本线程中调用get()方式等待任务执行完成再处理业务