1. 原理
1.1 TaskScheduler
TaskScheduler是spring的定时任务使用的线程池的关键类
public interface TaskScheduler {
// 通过Trigger执行任务
ScheduledFuture schedule(Runnable task, Trigger trigger);
// 指定时间执行任务
ScheduledFuture schedule(Runnable task, Date startTime);
// 指定在指定时间后,循环周期执行任务
ScheduledFuture scheduleAtFixedRate(Runnable task, Date startTime, long period);
// 循环周期执行任务
ScheduledFuture scheduleAtFixedRate(Runnable task, long period);
// 延迟N时间,在指定日期执行
ScheduledFuture scheduleWithFixedDelay(Runnable task, Date startTime, long delay);
ScheduledFuture scheduleWithFixedDelay(Runnable task, long delay);
}
TaskScheduler有两种实现方式:
- TimerManagerTaskScheduler:使用外部对象管理线程池,如 CommonJ TimerManager,适用于多个进程共享线程池
- ThreadPoolTaskScheduler: 如果仅仅在同一进程管理线程池,则推荐使用此对象。它实际使用Java自我的ScheduledExecutorService管理线程池
1.2 Trigger
Trigger是定时任务配置的关键类,配置方法的下次执行时间
public interface Trigger {
Date nextExecutionTime(TriggerContext triggerContext);
}
方法里的参数TriggerContext是封装了任务最后执行的时间和最后执行完毕的时间
public interface TriggerContext {
Date lastScheduledExecutionTime();
Date lastActualExecutionTime();
Date lastCompletionTime();
}
TriggerContext默认的实现是SimpleTriggerContext,看源码实现非常简单
Trigger的实现类:
- CronTrigger:使用cron表达式定义任务执行时机
如:scheduler.schedule(task, new CronTrigger("0 15 9-17 * * MON-FRI"));
- PeriodicTrigger:通过“fixed period,”,“initial delay value”,“boolean to indicate whether the period should be interpreted as a fixed-rate or a fixed-delay”3个参数配置任务执行的时机
2. 定时方法@Scheduled
通过&