Spring 中的 Task Scheduler 是一个轻量级的定时任务实现,需要的配置很少,使用简单。以下介绍通过 Java 配置使用Task Scheduler :
-
编写作业类类并添加
@Component
注解声明为 bean,在执行任务的方法上添加@Scheduled
注解,方法不能有返回值。如:@Component public class TestJob { @Scheduled(cron = "0/5 * * * * ? ")//每隔5秒隔行一次 public void doJob() { System.out.println("test job"); } }
-
@Scheduled
注解可以有其他参数,fixedDelay 表示从上一个任务完成开始到下一个任务开始的间隔,fixedRate 表示从上一个任务开始到下一个任务开始的间隔,单位是毫秒。 -
在带有
@Configuration
注解的配置类添加@EnableScheduling
注解,使 Spring 能够识别@Scheduled
所修饰的方法。 -
项目启动时候可能会报出
No qualifying bean of type [org.springframework.scheduling.TaskScheduler] is defined
异常信息,这是因为Spring的定时任务调度器会尝试获取一个注册过的 task scheduler 来做任务调度,它会尝试通过BeanFactory.getBean()的方法来获取一个注册过的 scheduler bean。首先尝试从配置中找到一个TaskScheduler Bean,接着寻找ScheduledExecutorService Bean,在之前两步找不到时再使用默认的scheduler。日志打印出来的异常信息并非错误信息,不会影响使用,可以在 log4j 的配置中中添加log4j.logger.org.springframework.scheduling = INFO
来去掉这个输出。 -
如果定时任务每次都会执行两次,是由于 Spring 的配置加载了两次。
cron 表达式介绍:
-
Quartz Cron 表达式支持七个域
名称 是否必须 允许值 特殊字符 秒 是 0-59 ,-*/ 分 是 0-59 ,-*/ 时 是 0-23 ,-*/ 日 是 1-31 ,-*?/LWC 月 是 1-12或JAN等 ,-*/ 周 是 1-7或SUN等 ,-*?/LC# 年 否 空或2016等 ,-*/
-
月份和星期的名称不区分大小写。FRI 和 fri 是一样的。
-
域之间有空格分隔
* * * ? * *
,这个表达会每秒钟(每分种的、每小时的、每天的)激发一个部署的 job。 -
*
星号表示这个域上包含所有合法的值。例如,在月份域上使用星号意味着每个月都会触发这个 trigger。 -
?
问号只能用在日和周域上,但是不能在这两个域上同时使用。你可以认为?
字符是 不关心在该域上是什么值,表示不为该域指定值。两域的其中一个指定了值,那就必须在另一个字值上放一个?
。0 10,44 14 ? 3 WEB
表示三月中的每个星期三的下午 2:10 和 下午 2:44 被触发。 -
,
逗号用来在给某个域上指定一个值的列表。如0 0,15,30,45 * * * ?
表示每刻钟触发一次 trigger。 -
/
斜杠用于时间表的递增。0/15 0/30 * * * ?
表示在整点和半点时每15秒触发 trigger。 -
-
中划线用于指定范围。例如,在小时域上的 3-8 意味着 "3,4,5,6,7 和 8 点"。域的值不允许回卷,所以像 50-10 这样的值是不允许的。0 45 3-8 ? * *
表示在上午的3点至上午的8点的45分时触发 trigger。 -
L
说明了某域上允许的最后一个值,仅被日和周域支持。当用在日域上,表示的是在月域上指定的月份的最后一天。0 0 8 L * ?
表示在每个月最后一天的上午 8:00 触发 trigger。当使用于周域上,可以用一个数字与 L 连起来表示月份的最后一个星期 X。 -
W
字母代表平日 (Mon-Fri),仅能用于日域中。用来指定离指定日的最近的一个平日。例如,日域中的 15W 意味着 "离该月15号的最近一个平日"。 假如15号是星期六,那么 trigger 会在14号(星期五)触发。W 只能用在指定的日域为单天,不能是范围或列表值。 -
#
井号仅能用于周域中,用于指定月份中的第几周的哪一天。例如,如果你指定周域的值为 6#3,它意思是某月的第三个周五 (6=星期五,#3意味着月份中的第三周)。注意,假如你指定 #5,然而月份中没有第 5 周,那么该月不会触发。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于