Spring Boot系列(二):添加定时任务

简介

Spring Boot本身自带了一个轻量级的Quartz,所以无需导入任何东西,只需要一个注解就可以开启定时为我们所用了。

完成定时任务程序

创建Boot工程后,在启动类上添加@EnableScheduling注解,如:

@SpringBootApplication
@EnableScheduling
public class QuartzDomeApplication {

    public static void main(String[] args) {
        SpringApplication.run(QuartzDomeApplication.class, args);
    }
}

第二步创建一个任务类:

/**
 * @author: uncle
 * @apdateTime: 2018-01-09 12:23
 */
@Component
public class ScheduledTasks {
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 每隔5秒打印当前时间
     */
    @Scheduled(fixedRate = 5000)
    public void reportCurrentTime() {
        System.out.println("当前时间:" + dateFormat.format(new Date()));
    }
}

此时一个定时任务就完成了,咱们看看@EnableScheduling

public @interface Scheduled {
    // 根据Cron表达式执行,在另外的任务调度器文章里有详细介绍
    String cron() default "";
    
    // 时区,默认为当前时区,一般没有用到。
    String zone() default "";
    
    // 项目启动时执行,后每隔指定时间执行一次(如果任务时间超出了fixedDelay定义的时间,则是根据任务执行完成后,再延迟指定时间执行)
    long fixedDelay() default -1; 
    
    String fixedDelayString() default "";
    
    // 项目启动时执行,后每隔指定时间执行一次(如果任务时间超出了fixedRate定义的时间,则根据任务完成时间来执行,fixedRate时间会被覆盖)
    long fixedRate() default -1;
    
    String fixedRateString() default "";
    
    // 第一次执行延迟的时间(需要配合fixedDelay或fixedRate使用)
    long initialDelay() default -1;
    
    String initialDelayString() default "";
}

多线程执行定时任务

以上执行都是单线程,多线程执行的话需要创建一个配置类并实现SchedulingConfigurer ,重写它的方法。

/**
 * @author: uncle
 * @apdateTime: 2018-01-09 13:09
 */
@Configuration
public class Threads implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        // 设置线程数
        taskRegistrar.setScheduler(new ScheduledThreadPoolExecutor(10));
    }
}
Last modification:January 9th, 2018 at 01:18 pm
If you think my article is useful to you, please feel free to appreciate

One comment

  1. qaq

    请问如何指定cron的时区呢,急求

Leave a Comment