Spring Boot教程(13) – 简单定时任务

“每隔几分钟执行一个任务”这种需求,几乎在每个项目里都有可能遇到。Spring框架提供了一种简单的方式来完成这一需求。你只需要在定时执行的方法上加上注解就行了。

首先你需要开启这一功能:在任何一个@Configuration类上添加上@EnableScheduling注解:

这个@EnableScheduling注解,是放在Spring框架spring-context模块,它比较基础,同时也被Spring Boot所依赖,所以不需要引入额外的库。

然后在你的组件中,创建需要定时执行的方法,并添加@Scheduled注解。下图演示了两种定时任务的写法,他们两个都是“每隔10秒钟”执行一个任务,但是稍稍有些区别。fixedRate参数表明前后两次任务的开始时间相差10秒,fixedDelay参数表明前一次任务结束时间和后一次的开始之间相差10秒。

对于以上两种方式,你还可以添加initialDelay参数,等程序启动一段时间之后,再开始跑定时任务。

另外,三个参数fixedRatefixedDelayinitialDelay都是long类型,都表示毫秒,你还可以用更易读的方式来传递时间,使用fixedRateStringfixedDelayStringinitialDelayString参数,传递表示时间长度的字符串。他们的格式为PnDTnHnMn.nS,其中的n替换为数字,使用方法如下:

表示时间长度的字符串在框架里最终会被解析成java.time.Duration对象,感兴趣的可以去看看Duration的介绍和源码等。

还有一种需求,不太好描述,比如“每天晚上2点备份数据”这种操作,用上面介绍的方法不太好计算initialDelay,不过如果你用过cron或者crontab命令写过定时任务的话,应该知道这类需求是比较好描述的。考虑到这种情况,@Scheduled还提供了cron参数,可以使用类似的语法描述任务的时间。

cron参数一点一点解释挺麻烦的,不如直接看怎么用:

  • 0 0 * * * * 每个整点
  • */10 * * * * * 每十秒
  • 0 0 8-10 * * * 每天八点九点十点
  • 0 0 6,19 * * * 每天6点和19点
  • 0 0/30 8-10 * * * 每天的8点,8点半,9点,9点半,10点,10点半
  • 0 0 9-17 * * MON-FRI 周一到周五的9点到17点,每个整点

空格把字符串分成六个部分,分别表示秒,分,时,日,月,星期。包含数字和符号:

  • 星号*表示“所有,每个”,
  • 减号-表示“区间”
  • 逗号,表示“列表”。
  • 斜杠/表示序列,左侧为开始时间,右侧为步长
  • 问号?表示“每个可能的时间”,话说我也没搞懂这个的作用,如果你想搞懂的话不妨搜索下“cron question mark

一旦当前时间匹配了cron字符串,你的任务就会执行。写完字符串之后,记得加个注释,告诉你的朋友或者同事是啥意思,并不是每个人都看的清楚,甚至你自己过了几个月之后也看不懂了。更多相关内容你可以查看CronSequenceGenerator类的源码。

注意,这种定时任务的使用方式只适用于单机的情况,如果你的项目是分布式的,每个机器上程序运行的时候都会有一套定时操作,跑起来肯定乱套了。此类需求可以用Quartz来实现。

发表评论

电子邮件地址不会被公开。