刚刚看了下Spring Boot实现定时任务的文章,感觉还不错。Spring Boot 使用Spring自带的Schedule来实现定时任务变得非常简单和方便。在这里个大家分享下
开启scheduler支持
@SpringBootApplication
@EnableScheduling
public class Application{
public static void mian(String[] args){
SpringApplication.run(Application.class,args);
}
}
编写定时任务
第一种 定时执行
@Component
public class ScheduledTask {
@Scheduled(cron = "*/5 * * * * ?")
public void task1() throws InterruptedException {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " " + Thread.currentThread().getName() + " 任务一启动");
Thread.sleep(10000);//任务耗时10秒
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " " + Thread.currentThread().getName() + " 结束");
}
@Scheduled(cron = "*/5 * * * * ?")
public void task2() throws InterruptedException {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " " + Thread.currentThread().getName() + " 任务二启动");
Thread.sleep(10000);
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " " + Thread.currentThread().getName() + " 结束");
}
}
#运行结果
2019-04-25 11:27:40 pool-1-thread-1 任务一启动
2019-04-25 11:27:50 pool-1-thread-1 任务一结束
2019-04-25 11:27:50 pool-1-thread-1 任务二启动
2019-04-25 11:28:00 pool-1-thread-1 任务二结束
2019-04-25 11:28:00 pool-1-thread-1 任务一启动
2019-04-25 11:28:10 pool-1-thread-1 任务一结束
2019-04-25 11:28:10 pool-1-thread-1 任务二启动
cron可以参考[cron参数详解]
(https://www.jianshu.com/p/09150a256269)
通过运行结果可以发现,任务一和任务二是线性依次执行的,所有的任务都是在同一个线程池中的同一个线程来完成的
第二种 间隔执行
//每个5000毫秒执行一次
@Scheduled(fixedRate = 5000)
public void reportCurrentTime() {
System.out.println("每隔五秒钟执行一次: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
任务并发执行配置
那么,怎么设计成多线程实现并发呢?在网上看到过这样的解决方案。通过ScheduleConfig配置文件实现SchedulingConfigurer接口,并重写setScheduler方法
@Component
public class ScheduledConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(TaskScheduler());
}
@Bean(destroyMethod = "shutdown")
public Executor TaskScheduler() {
return Executors.newScheduledThreadPool(10);
}
}
2019-04-25 14:10:20 pool-2-thread-2 任务二启动
2019-04-25 14:10:20 pool-2-thread-1 任务一启动
2019-04-25 14:10:30 pool-2-thread-2 任务二结束
2019-04-25 14:10:30 pool-2-thread-1 任务一结束
2019-04-25 14:10:35 pool-2-thread-1 任务一启动
2019-04-25 14:10:35 pool-2-thread-2 任务二启动
通过运行结果可以看出,两个任务可以同时执行,同一个任务不会并发执行(对于同一个任务,上一个执行完后,再进行下一次任务,可以看出两个任务都是过了10秒执行完后,等待5秒再次执行,而不是固定的5秒一次)
对于同一个任务也想要并发执行可以加上@Async注解,思路就是使任务执行也是异步即可