@Configuration @EnableScheduling public class SchedulingConfig { }
@Scheduled使用例子
// 每天12时定时执行 @Scheduled(cron = "0 0 12 * * *") public void autoTask1() { // code ...... } // 初始化任务执行延时initialDelay毫秒,上个任务完成后,间隔fixedDelay毫秒后继续运行 @Scheduled(initialDelay = 8000, fixedDelay = 5000) public void autoTask2() { // code ...... }
@Scheduled的定义
下面具体看下@Scheduled的定义
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Repeatable(Schedules.class) public @interface Scheduled { String CRON_DISABLED = "-"; String cron() default ""; String zone() default ""; long fixedDelay() default -1L; String fixedDelayString() default ""; long fixedRate() default -1L; String fixedRateString() default ""; long initialDelay() default -1L; String initialDelayString() default ""; }
cron: 一个类似 cron 的表达式,扩展了通常的 UN*X 定义以包括在秒、分、小时、月中的某一天、月份和星期几的触发器。
fixedDelay: 上个任务完成后,间隔fixedDelay毫秒后继续运行
fixedDelayString: 类似fixedDelay
fixedRate: 在方法执行之间以固定时间(毫秒)段执行方法,该方式可能方法上次未执行完成,下次已开始执行。
initialDelay: 初次执行方法的延时时间,单位毫秒。
自定义任务执行线程池
查看@EnableScheduling相关源码,可以发现后台执行任务的线程池是1个线程,如果任务较多,执行时间有冲突,会造成任务的执行无法满足需求。
protected void scheduleTasks() { if (this.taskScheduler == null) { this.localExecutor = Executors.newSingleThreadScheduledExecutor(); this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor); } ...... } protected ScheduledExecutorService createExecutor( int poolSize, ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler) { //poolSize=1 return new ScheduledThreadPoolExecutor(poolSize, threadFactory, rejectedExecutionHandler); }
下面的代码就自定义了一个拥有10个线程的后台任务调度,需要创建一个TaskScheduler类型的对象即可。
@Bean("taskScheduler") public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); taskScheduler.setPoolSize(10); return taskScheduler; }