注解@Scheduled笔记

发布时间 2023-06-01 21:47:36作者: danielzzz

简介

@Scheduled是Spring框架中一个用于指定定时任务的注解,它可以标注在方法上,表示这个方法是一个定时任务,会按照指定的时间间隔执行。
 

常见的定时任务时间间隔包括:

  1. @Scheduled(fixedDelay = xxx):表示间隔多少毫秒执行一次任务;
  2. @Scheduled(fixedRate = xxx):表示每多少毫秒执行一次任务;
  3. @Scheduled(cron = "xxx"):基于cron表达式指定定时任务执行时间。

在Spring Boot中,所有通过@Scheduled注解定义的定时任务都会被放入一个公用的线程池中执行,默认情况下,该线程池的并发线程数为1,即所有的任务会使用同一个线程被依次执行。

具体来说,当一个定时任务到达其触发时间时,Spring Boot将会从线程池中获取一个线程来执行该任务。如果同一时间有多个任务同时触发,那么这些任务将会按照任务定义的顺序依次排队,等待线程池中的线程被释放后依次执行。

我们可以通过在application.propertiesapplication.yml文件中设置spring.task.scheduling.pool.size属性来配置线程池中的线程数。例如,可以设置该参数的值为2,默认为1,以便在执行任务时使用多个线程,提高任务并行度和执行效率。如果想要更高的并行度,还可以将线程池的队列大小queue-capacity设置为合适的值来防止任务过多导致线程池崩溃。

需要注意的是,在多个任务共享同一个线程池的情况下,如果其中一个任务出现长时间阻塞或者执行时间过长的情况,可能会影响下一个任务的执行时间或者与后续任务的并行执行。因此,建议在编写任务代码时,尽量保证任务能够在较短的时间内执行完毕,并且不会出现阻塞的情况。如果任务代码中有可能出现阻塞或者长时间执行的操作,可以将这些操作放到异步线程中执行,避免对主线程造成阻塞影响其他任务的执行。

注意:

在 Spring 中,如果一个类中使用了 @EnableScheduling 注解开启了定时任务的支持,
那么这个类中定义的所有带有 @Scheduled 注解的方法都会被自动注册为任务,并按照给定的执行规则周期性地执行。
当其他类中也定义了带有 @Scheduled 注解的方法时,虽然这些方法不在 @EnableScheduling 注解所在的类中,
但它们同样被自动注册为任务,并可以按照指定的规则执行。
这是因为 Spring 会自动扫描整个应用程序的类,并自动注册所有具有 @Scheduled 注解的方法。
因此,当您在一个类中使用 @EnableScheduling 注解时,即使其他类中也定义了带有 @Scheduled 注解的方法,只要它们被成功注册到 Spring 容器中,它们也可以被执行。
【一般我们只在启动类上使用@EnableScheduling注解】