今天有系统对接需要使用接口推送历史数据,因为是小程序的后台,不能写一个按钮来调用方法推送历史数据,就想通过定时任务来向其他系统推送历史数据。
目前定时任务的种类有四种:
名称 | 特点 |
quartz | quartz 是一个开源组织提供的功能强大的开源项目,既能按照一个指定的时间进行简单的调度作业,也能根据一个时间间隔进行循环调度作业,还能把多个作业和多个不同的触发器进行关联,进行复杂的调度作业 |
spring task | 是一个相较于quartz轻量的定时任务框架,从spring3.0后spring就把task整合进去,如果使用的话不需要额外引入jar包,springboot项目下可以很简单的实现大部分的业务需求,并且实现起来很简单,缺点下面会涉及到 |
timer | java中自带的定时任务,缺点比多 |
scheduledExecutorService | java1.5后新增的定时任务,进行简单的任务调度,跟timer相比推荐使用这一个 |
要了解的是
1 每种定时任务支持做什么
2定时任务中的cron 的写法和意义
cron表达式详解:
cron表达式是一个控制触发调度任务时间的字符串,这个表达式中是有至少6(最多7个)个时间域,并且时间域之间用空格隔开。为什么会有至少6个时间域最多7个时间域这种说法呢?第一不同的定时允许的cron表达式不同,spring task的cron允许的如时间域就是6个,没有年的时间域,如果不为6个数量会报错(Cron expression must consist of 6),而quartz是七个时间域;第二
quartz的七个时间域中的年可以省略不写。
由左03向右时间域代表的意义:
时间域 | 含义 | 允许出现字符 | 有效范围 |
seconds | 秒 | “, - * /”四个特殊字符 | 0-59的整数 |
minutes | 分 | “, - * /”四个特殊字符 | 0-59的整数 |
hours | 小时 | “, - * /”四个特殊字符 | 0-59的整数 |
dayofMonth | 一个月中第几天 | “, - * / ? L W C”八个特殊字符 | 0-31整数 |
month | 月 | “, - * /”四个特殊字符 | 1-12或JAN-DEC |
dayofweek | 一周内第几天 | ",- * / ? L C #"八个字符 | 1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一 |
year | 年(spring task不存在,quartz可以省略不写) | “, - * /”四个特殊字符 | 1970-2099 |
特殊字符的含义:
符号 | 意义 | 使用域 |
* | 在该时间域匹配任何值 | 所有时间域 |
, | 枚举值逗号前后的值都会执行 | 所有时间域 |
/ | 开始时间开始出发,然后每隔/后时间触发一次 | |
- | 表示一个时间范围 | 所有时间域 |
? | 不确定的值,因为月中日,和型其中日可能冲突,所以用? 0 0 0 1 * * 每天都触发 0 0 0 1 * ? 每月1号触发 |
只在dayOfMonth 和dayOfWeek使用 |
L | 表示最后,如果在星期域上使用5L表示最后一个周四触发 | 只在dayOfMonth 和dayOfWeek使用 |
W | 表示工作日,周一到周五,如果dayOfMonth写的是6w,假如6日是工作日则触发,如果6日是周六则在5日(周五触发),如果6日是周日,则7日触发(周一) | 只在dayOfMonth使用 |
LW | 表示一个月的最后一个工作日(周五) | 只在dayOfMonth使用 |
# | 用于确定每个月的第几个星期几,例如4#2 表示某月的第二个星期三 | 只在dayOfMonth使用 |
在工作中发现springboot 使用springtask 特别简单,但是发现他的时间域只有6个,不存在年的时间域,也就是意味着使用spring task的话不能指定时间触发一次这种定时任务。
quartz:
quartz有几个核心的概念:scheduler,tri