一、单线程使用Scheduled
- 在启动类Application上加
@EnableSchedulin
注解,开启spring定时任务 - 创建任务类,加
@Component
注解 - 在方法上加
@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
-
修改spirng原生的Scheduled的线程池配置,使其满足需要的多线程以及其他功能
-
使用配置文件修改配置
spring: http: task: scheduling: pool: # 线程数目 size: 3 # 任务名称 thread-name-prefix: 定时任务 # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true shutdown: await-termination: true # 等待任务完成的最大时长,单位为秒。默认为 0 ,根据自己应用来设置 await-termination-period: 60
-
使用配置类
@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; } }
-
-
使用异步线程池
创建线程池,并在
@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; } }