与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
最终
使用异步+定时任务来实现定时任务不阻塞