Spring调度类似Quartz机制,Quartz是一个非常有用的库,适用于具有更复杂调度要求的应用,而Spring的调度只需要一个@Scheduled,加入任何一个你需要定时执行的方法,并使用linux cron格式写入时间,其余都是SpringBoot自己来照顾执行,Spring Boot在内部使用该 TaskScheduler 接口来调度带注释的执行方法。
只需将@EnableScheduling注释添加到主应用程序类或其中一个配置类,即可启用调度@Scheduled标注的方法,注意一共是两个步骤:@EnableScheduling 和 @Scheduled 分别标注。
如下:
@SpringBootApplication @EnableScheduling public class SpringbatchApplication { public static void main(String[] args) { SpringApplication.run(SpringbatchApplication.class, args); } }
我们以前面的SpringBatch为案例,我们希望定期执行这个批处理转换,那么只要在@Configuration类中加入调用计划方法:
@Autowired private Job importUserJob ; // This job runs in every 5 seconds @Scheduled(fixedRate = 5000) public void printMessage() { try { JobParameters jobParameters = new JobParametersBuilder().addLong( "time", System.currentTimeMillis()).toJobParameters(); jobLauncher.run(importUserJob, jobParameters); System.out.println("I have been scheduled with Spring scheduler"); } catch (Exception e) { e.printStackTrace(); } }
其中importUserJob是我们Spring batch的导入User数据的Job,我们新增了方法printMessage,然后定义了@Scheduled(fixedRate = 5000),5秒执行一次importUserJob这个任务。
其他调度写法:
@Scheduled(cron = "0 * * * * ?")
上面是每分钟执行一次任务。
默认情况下,所有@Scheduled任务都在Spring创建的大小为1的默认线程池中执行。我们可以创建自己的线程池并配置Spring以使用该线程池来执行所有计划任务:
@Configuration public class SchedulerConfig implements SchedulingConfigurer { private final int POOL_SIZE = 10; @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); threadPoolTaskScheduler.setPoolSize(POOL_SIZE); threadPoolTaskScheduler.setThreadNamePrefix("my-scheduled-task-pool-"); threadPoolTaskScheduler.initialize(); scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler); } }
这就是配置Spring以使用自己的线程池而不是默认线程池所需要做的全部工作。
Spring Batch