一、单线程应用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@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; }}
应用异步线程池
创立线程池,并在
@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; }}