与Quarts的区别
自动配置类参考 TaskSchedulingAutoConfiguration
//@Slf4j//@Component//@EnableScheduling // 开启定时功能//@EnableAsync // 开启异步任务功能public class HelloSchedule {/*** 一、与Quarts的区别* 1、Spring中的定时任务由6位组成,不支持第7位的年* 2、第6位的数字格式,1-7,代表周一到周日,当然也可以写成MON-SUN* 3、其它普遍与Quarts一致** 二、定时任务默认是阻塞的* 只要当前任务没执行完,下一个任务就执行不了*/// @Scheduled(cron = "*/5 * * ? * 1") // 开启定时任务// public void hello(){// log.info("hello");// }/*** 三、使用定时任务+异步任务解决阻塞问题** @throws InterruptedException*/// @Scheduled(cron = "* * * ? * 1")// @Async // 执行异步任务// public void block() throws InterruptedException {// log.info("hello......");// Thread.sleep(3000);// }}
定时任务默认是阻塞的
二、定时任务默认是阻塞的 ,只要当前任务没执行完,下一个任务就执行不了 。因为定时任务默认线程只有一个。
解决定时任务阻塞的方法
- 可以使用异步任务的方式,CompletableFuture.runAsync(),自己提交到线程池
- 自动配置类参考 TaskSchedulingAutoConfiguration,定时任务默认线程只有一个
所以可以在配置文件中重新配置:spring.task.scheduling.pool.size=5
让定时任务异步执行:
首先在类上面标注@EnableAsync,开启异步任务功能
然后在方法上标注@Async,执行异步任务
开启异步任务
- 首先在类上面标注
@EnableAsync,开启异步任务功能 - 然后在方法上标注
@Async,执行异步任务 - 这个异步任务不是只能搭配定时任务,它可以替代
CompletableFuture - 自动配置类参考
TaskExecutionAutoConfiguration - 它在配置文件中的线程池属性是:
spring.task.execution.pool.xxx
最终
使用异步+定时任务来实现定时任务不阻塞
