在springboot中,我们一般是通过如下的做法添加一个定时任务
文章插图
上面的new CronTrigger("0 * * * * *")中的参数0 * * * * *就是cron表达式了 。
这里主要是对cron表达式的源码进行分析,其他内容不再展开了 。这能看到会创建一个CronTrigger对象,这个对象它主要就是用来包装解析后的cron表达式,获取任务下次执行的时间 。
文章插图
在CronTrigger构造方法中会调用到this.expression = CronExpression.parse(expression);将我们传入的cron字符串解析成为CronExpression对象 。
CronExpression主要有一个next方法,它会根据当前cron表达式解析出来的对象,以及传入的时间,返回一个时间值,也就是下次任务执行的时间 。
文章插图
这里的入参需要实现Temporal接口 。这是在JDK8引入的一套全新的时间、日期 。
能引入新的,至少说明之前的Date等等之类的时间处理是不能满足各方面需要的 。下面看看它的主要实现
文章插图
这里我们一般常用的可能就是Instant,LocalDateTime,ZonedDateTime了 。
从上面就可以看到cron表达式的处理,主要是分为两步:1、将cron表达式字符串解析为CronExpression对象;2、根据传入的时间计算下次任务的执行时间 。
在分析源码之前,我们简单看几个java中的类
- ValueRange主要用来表示时间、日期字段的有效范围 。当然它也可以不用来表示时间、日期 。下面我们简单看下它的使用 。
它主要有4个字段,4个属性值从上到下是不小于的关系 。
- ChronoField是一个枚举类 , 就是用来表示时间、日期的字段 。
下面我们简单看它的几个实例
- ChronoUnit也是一个枚举类 , 表示一个时间单元 。有一个addTo方法表示给时间加上一个对应的时间单元 。
1、将cron表达式字符串解析为CronExpression对象我们传入的表达式用空格分成6个部分,每个部分代表的含义如下:
文章插图
在CronField类中有一个内部枚举类Type,它就是用来表示cron表达式中的字段(
在cron表达式中没有纳秒字段,其他都跟cron表达式是一一对应的
文章插图
先看下它的构造方法
文章插图
从上面也可以看到这个枚举类有两个字段,第一个是表示当前时间、日期的字段,后面是一个用来表示小于它的时间、日期字段的数组 。
代码的如下图
文章插图
主要代码就是上面框出来的:
- 将我们传入的cron字符串分割成数组 。
- 分别解析每个部分,创建CronExpression对象 。
推荐阅读
- springboot自动配置原理以及手动实现配置类
- SR寄存器BP[x:0]位 痞子衡嵌入式:一个关于Segger J-Flash在Micron Flash固定区域下载校验失败的故事
- 三十六 Java开发学习----SpringBoot三种配置文件解析
- SpringBoot 常用读取配置文件的 3 种方法!
- 之三 2流高手速成记:SpringBoot整合mybatis/mybatis-plus实现数据持久化
- 面试突击87:说一下 Spring 事务传播机制?
- 一文搞定 Spring事务
- cron和tar的使用技巧
- 春节英语作文100字 春节英语作文
- 怎么算预产期