Springboot利用@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;
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注