一、单线程应用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; } }