一、单线程应用Scheduled

  1. 在启动类Application上加@EnableSchedulin注解,开启spring定时工作
  2. 创立工作类,加@Component注解
  3. 在办法上加@Scheduled()注解,有以下三种形式
    // corn模式     @Scheduled(cron = "0 0 0 0/1 * ?")     // fixedDelay:在上一次工作执行实现后几豪秒再执行,     // initialDelay:利用启动后提早几豪秒执行该工作    @Scheduled(initialDelay =2000,fixedDelay = 2000)    // fixedRate 在上一次工作执行开始后几豪秒执行,    @Scheduled(initialDelay =2000,fixedRate = 5000)

留神:这里的所有工作都是用一个线程执行,因为spring的Scheduled默认线程数目=1,所有这里不反对多线程

二、多线程应用Scheduled

  1. 批改spirng原生的Scheduled的线程池配置,使其满足需要的多线程以及其余性能

    1. 应用配置文件批改配置

      spring:  http:    task:      scheduling:        pool:          # 线程数目          size: 3          # 工作名称        thread-name-prefix: 定时工作        # 利用敞开时,是否期待定时工作执行实现。默认为 false ,倡议设置为 true        shutdown:          await-termination: true          # 期待工作实现的最大时长,单位为秒。默认为 0 ,依据本人利用来设置          await-termination-period: 60
    2. 应用配置类

      @Slf4j@Configurationpublic class ScheduledConfig {    // 配置定时工作线程池    @Bean    public ThreadPoolTaskScheduler taskScheduler() {        ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();        executor.setPoolSize(5);        executor.setThreadNamePrefix("定时工作-");        // executor.setth        // 利用敞开时,是否期待定时工作执行实现。默认为 false ,倡议设置为 true        executor.setWaitForTasksToCompleteOnShutdown(true);        // 期待工作实现的最大时长,单位为秒。默认为 0 ,依据本人利用来设置        executor.setAwaitTerminationSeconds(120);        return executor;    }}
  1. 应用异步线程池

    创立线程池,并在@Scheduled()@Async注解,

    留神:应用了异步后,fixedDelay模式无奈失效,所以如果有这个模式,不能加@Async

        @Async    @Scheduled(cron = "0 0 0 0/1 * ?")    public void excute() {        //dosomething    }
    @Slf4j@Configuration@EnableAsyncpublic class AsyncConfig { //implements AsyncConfigurer    @Value(value = "${async.corePoolSize}")    private int corePoolSize;    @Value(value = "${async.maxPoolSize}")    private int maxPoolSize;    @Value(value = "${async.queueCapacity}")    private int queueCapacity;    //    //@Autowired    //private HttpTaskRejectHandler httpTaskRejectHandler;    //如果Bean名字不是taskExecutor,就用在@Async("httpTaskExecutor")这里加上名字。    @Bean    public ThreadPoolTaskExecutor taskExecutor() {        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();        executor.setCorePoolSize(corePoolSize);        executor.setMaxPoolSize(maxPoolSize);        executor.setQueueCapacity(queueCapacity);        executor.setThreadNamePrefix("异步工作——");        //队列满,线程被拒绝执行策略,打印        // executor.setRejectedExecutionHandler(httpTaskRejectHandler);        //队列满,抛弃最老的工作        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());        executor.initialize();        return executor;    }}