在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个部分,每个部分代表的含义如下:
经验总结扩展阅读
- springboot自动配置原理以及手动实现配置类
- SR寄存器BP[x:0]位 痞子衡嵌入式:一个关于Segger J-Flash在Micron Flash固定区域下载校验失败的故事
- 三十六 Java开发学习----SpringBoot三种配置文件解析
- SpringBoot 常用读取配置文件的 3 种方法!
- 之三 2流高手速成记:SpringBoot整合mybatis/mybatis-plus实现数据持久化
- 面试突击87:说一下 Spring 事务传播机制?
- 一文搞定 Spring事务
- excel中如何使用countif的表达式进行统计?你知道吗?
- 春节的由来是什么
- 氯酸钾制取氧气的文字表达式