某些时候我们可能需要在某些固定的时间或者是间隔一定的时间连续执行一些任务,如每天凌晨自动跑一些批次/心跳检测等。Spring通过使用TaskScheduler来完成这些功能。
本文目录:
1 Trigger
先对在TaskScheduler中将会使用到Trigger对象进行分析。
Trigger接口用于计算任务的下次执行时间。它的接口定义如下:
public interface Trigger {
/**
* Determine the next execution time according to the given trigger context.
* @param triggerContext context object encapsulating last execution times
* and last completion time
* @return the next execution time as defined by the trigger,
* or {@code null} if the trigger won't fire anymore
*/
@Nullable
Date nextExecutionTime(TriggerContext triggerContext);
}
可见它仅提供了一个接口:nextExecutionTime来获取下次执行时间。
这个方法接收的参数为TriggerContext对象,它能够获取上次任务原本的计划时间/实际的执行时间以及实际的完成时间。
Trigger接口的实现包含以下两个:
1.1 CronTrigger
它通过Cron表达式来生成调度计划。
如:
scheduler.schedule(task, new CronTrigger("0 15 9-17 * * MON-FRI"));
以上表达式表示在工作日的9-17点之间,每隔15分钟执行一次;
关于Cron表达式的具体内容,在此不进行详述。
1.2 PeriodicTrigger
用于定期执行的Trigger;它有两种模式:
- fixedRate:两次任务开始时间之间间隔指定时长
- fixedDelay: 上一次任务的结束时间与下一次任务开始时间间隔指定时长
可见这两种情况的区别就在于,在决定下一次的执行计划时是否要考虑上次任务在什么时间执行完成。
默认情况下PeriodicTrigger使用了fixedDelay模式。
PeriodicTrigger提供以下参数来达成目的:
- period: long类型,表示间隔时长,注意在fixedRate与fixedDelay两种模式下的不同含义
- timeUnit: TimeUnit类型,表示间隔时长的单位,如毫秒等;默认是毫秒
- initialDelay: long类型,表示启动任务后间隔多长时间开始执行第一次任务
- fixedRate: boolean类型,表示是否是fixedRate,为True时是fixedRate,否则是fixedDelay,默认为False
2 TaskScheduler接口简介
2.1 接口简介
TaskScheduler用于对Runnable的任务进行调度,它包含有多种触发规则。默认的实现是ThreadPoolTaskScheduler。
它的主要包含的方法及说明如下:
public interface