与Quarts的区别

自动配置类参考 TaskSchedulingAutoConfiguration

  1. //@Slf4j
  2. //@Component
  3. //@EnableScheduling // 开启定时功能
  4. //@EnableAsync // 开启异步任务功能
  5. public class HelloSchedule {
  6. /**
  7. * 一、与Quarts的区别
  8. * 1、Spring中的定时任务由6位组成,不支持第7位的年
  9. * 2、第6位的数字格式,1-7,代表周一到周日,当然也可以写成MON-SUN
  10. * 3、其它普遍与Quarts一致
  11. *
  12. * 二、定时任务默认是阻塞的
  13. * 只要当前任务没执行完,下一个任务就执行不了
  14. */
  15. // @Scheduled(cron = "*/5 * * ? * 1") // 开启定时任务
  16. // public void hello(){
  17. // log.info("hello");
  18. // }
  19. /**
  20. * 三、使用定时任务+异步任务解决阻塞问题
  21. *
  22. * @throws InterruptedException
  23. */
  24. // @Scheduled(cron = "* * * ? * 1")
  25. // @Async // 执行异步任务
  26. // public void block() throws InterruptedException {
  27. // log.info("hello......");
  28. // Thread.sleep(3000);
  29. // }
  30. }

定时任务默认是阻塞的

二、定时任务默认是阻塞的 ,只要当前任务没执行完,下一个任务就执行不了 。因为定时任务默认线程只有一个。

解决定时任务阻塞的方法

  1. 可以使用异步任务的方式,CompletableFuture.runAsync(),自己提交到线程池
  2. 自动配置类参考 TaskSchedulingAutoConfiguration,定时任务默认线程只有一个

所以可以在配置文件中重新配置:spring.task.scheduling.pool.size=5

  1. 让定时任务异步执行:

    首先在类上面标注@EnableAsync,开启异步任务功能
    然后在方法上标注@Async,执行异步任务

开启异步任务

  1. 首先在类上面标注@EnableAsync,开启异步任务功能
  2. 然后在方法上标注@Async,执行异步任务
  3. 这个异步任务不是只能搭配定时任务,它可以替代CompletableFuture
  4. 自动配置类参考 TaskExecutionAutoConfiguration
  5. 它在配置文件中的线程池属性是:spring.task.execution.pool.xxx

最终

使用异步+定时任务来实现定时任务不阻塞