1.单线程使用Scheduled在启动类Application上添加@EnableSchedulin注解,开启spring定时任务创建任务类,添加@Component注解在方法上添加@Scheduled()注解,有下面三个Method//cornmode@Scheduled(cron="0000/1*?")//fixedDelay:在上次任务执行完成后几毫秒执行,//initialDelay:延迟执行几毫秒应用程序启动后任务@Scheduled(initialDelay=2000,fixedDelay=2000)//fixedRate在上次任务执行开始后几毫秒执行,@Scheduled(initialDelay=2000,fixedRate=5000)注:此处所有任务使用一个线程Execution,因为Spring的Scheduled默认线程数是1,所以这里不支持多线程。2.多线程使用Scheduled修改spirng原生Scheduled的线程池配置,以满足需要的多线程等功能。使用配置文件修改配置spring:http:task:scheduling:pool:#线程数size:3#任务名称thread-name-prefix:定时任务#是否等待定时任务执行完成时该应用程序已关闭。默认为false,建议设置为trueshutdown:await-termination:true#等待任务完成的最长时间,单位秒。默认为0,根据自己的应用设置await-termination-period:60使用配置类@Slf4j@ConfigurationpublicclassScheduledConfig{//配置定时任务线程池@BeanpublicThreadPoolTask??SchedulertaskScheduler(){ThreadPoolTask??Schedulerexecutor=newThreadPoolTask??Scheduler();执行者.setPoolSize(5);executor.setThreadNamePrefix("定时任务-");//executor.setth//应用关闭时是否等待定时任务完成。默认为false,建议设置为trueexecutor.setWaitForTasksToCompleteOnShutdown(true);//等待任务完成的最长时间,以秒为单位。默认为0,设置executor.setAwaitTerminationSeconds(120);回归执行人;}}使用异步线程池创建线程池,在@Scheduled()中添加@Async注解。注意:使用异步后,fixedDelay模式不能生效,所以如果有这个模式,@Async@Async@Scheduled(cron="0000/1*?")publicvoidexcute(){//dosomething}@Slf4j@Configuration@EnableAsyncpublicclassAsyncConfig{//实现AsyncConfigurer@Value(value="${async.corePoolSize}")privateintcorePoolSize;@Value(value="${async.maxPoolSize}")privateintmaxPoolSize;@Value(value="${async.queueCapacity}")privateintqueueCapacity;////@Autowired//私有HttpTaskRejectHandlerhttpTaskRejectHandler;//如果Bean名称不是taskExecutor,使用@Async("httpTaskExecutor")在这里添加名称。@BeanpublicThreadPoolTask??ExecutortaskExecutor(){ThreadPoolTask??Executorexecutor=newThreadPoolTask??Executor();executor.setCorePoolSize(corePoolSize);executor.setMaxPoolSize(maxPoolSize);executor.setQueueCapacity(queueCapacity);"executor/ThreadNamePrefix"task/队列已满,拒绝线程执行策略,打印//executor.setRejectedExecutionHandler(httpTaskRejectHandler);//队列已满,丢弃最旧的任务executor.setRejectedExecutionHandler(newThreadPoolExecutor.DiscardOldestPolicy());executor.initialize();返回执行者;}}
