乐趣区

关于后端:springboot使用Scheduled定时任务

一、单线程应用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
      @Configuration
      public 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
    @EnableAsync
    public 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;
        }
    }
退出移动版