在springboot中启用@EnableScheduling注解可以很方便执行定时任务。启用@EnableScheduling如下
@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;
}
本文暂时没有评论,来添加一个吧(●'◡'●)