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;
      	}
      }
      
  2. 使用异步线程池

    创建线程池,并在@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;
        }
    }
    

你可能感兴趣的:(springboot,java,spring,spring,boot)