|
| 1 | +## ApiBoot Quartz |
| 2 | + |
| 3 | +`ApiBoot`内部集成了`Quartz`,提供了`数据库方式`、`内存方式`的进行任务的存储,其中`数据库`方式提供了`分布式集群任务调度`,任务自动平滑切换执行节点。 |
| 4 | + |
| 5 | +### 引用ApiBoot Quartz |
| 6 | + |
| 7 | +在`pom.xml`配置文件内添加,如下配置: |
| 8 | + |
| 9 | +```xml |
| 10 | +<!--ApiBoot Quartz--> |
| 11 | +<dependency> |
| 12 | + <groupId>org.minbox.framework</groupId> |
| 13 | + <artifactId>api-boot-starter-quartz</artifactId> |
| 14 | +</dependency> |
| 15 | +``` |
| 16 | + |
| 17 | +> 备注:如果使用`ApiBoot Quartz`的内存方式,仅需要添加上面的依赖即可。 |
| 18 | +
|
| 19 | +### 相关配置 |
| 20 | + |
| 21 | +| 参数名称 | 是否必填 | 默认值 | 描述 | |
| 22 | +| ------------------------------------------------------- | -------- | --------- | ------------------------------------------ | |
| 23 | +| `api.boot.quartz.job-store-type` | 否 | memory | 任务存储源方式,默认内存方式 | |
| 24 | +| `api.boot.quartz.scheduler-name` | 否 | scheduler | 调度器名称 | |
| 25 | +| `api.boot.quartz.auto-startup` | 否 | true | 初始化后是否自动启动调度程序 | |
| 26 | +| `api.boot.quartz.startup-delay` | 否 | 0 | 初始化完成后启动调度程序的延迟。 | |
| 27 | +| `api.boot.quartz.wait-for-jobs-to-complete-on-shutdown` | 否 | false | 是否等待正在运行的作业在关闭时完成。 | |
| 28 | +| `api.boot.quartz.overwrite-existing-jobs` | 否 | false | 配置的作业是否应覆盖现有的作业定义。 | |
| 29 | +| `api.boot.quartz.properties` | 否 | | Quartz自定义的配置属性,具体参考quartz配置 | |
| 30 | +| `api.boot.quartz.jdbc` | 否 | | 配置数据库方式的Jdbc相关配置 | |
| 31 | + |
| 32 | +### 内存方式 |
| 33 | + |
| 34 | +`ApiBoot Quartz`在使用内存方式存储任务时,不需要做配置调整。 |
| 35 | + |
| 36 | +### 数据库方式 |
| 37 | + |
| 38 | +需要在`application.yml`配置文件内修改`api.boot.quartz.job-store-type`参数,如下所示: |
| 39 | + |
| 40 | +```yaml |
| 41 | +api: |
| 42 | + boot: |
| 43 | + quartz: |
| 44 | + # Jdbc方式 |
| 45 | + job-store-type: jdbc |
| 46 | +``` |
| 47 | +
|
| 48 | +#### Quartz所需表结构 |
| 49 | +
|
| 50 | +`Quartz`的数据库方式内部通过`DataSource`获取数据库连接对象来进行操作数据,所操作数据表的表结构是固定的,`ApiBoot`把`Quartz`所支持的所有表结构都进行了整理,访问[Quartz支持数据库建表语句列表](<https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-quartz/src/main/resources/schemas>)查看,复制执行对应数据库语句即可。 |
| 51 | + |
| 52 | +### 创建任务类 |
| 53 | + |
| 54 | +我们只需要让新建类集成`QuartzJobBean`就可以完成创建一个任务类,如下简单示例: |
| 55 | + |
| 56 | +```java |
| 57 | +/** |
| 58 | + * 任务定义示例 |
| 59 | + * 与Quartz使用方法一致,ApiBoot只是在原生基础上进行扩展,不影响原生使用 |
| 60 | + * <p> |
| 61 | + * 继承QuartzJobBean抽象类后会在项目启动时会自动加入Spring IOC |
| 62 | + * |
| 63 | + * @author:恒宇少年 - 于起宇 |
| 64 | + * <p> |
| 65 | + * DateTime:2019-03-28 17:26 |
| 66 | + * Blog:http://blog.yuqiyu.com |
| 67 | + * WebSite:http://www.jianshu.com/u/092df3f77bca |
| 68 | + * Gitee:https://gitee.com/hengboy |
| 69 | + * GitHub:https://github.com/hengboy |
| 70 | + */ |
| 71 | +public class DemoJob extends QuartzJobBean { |
| 72 | + /** |
| 73 | + * logger instance |
| 74 | + */ |
| 75 | + static Logger logger = LoggerFactory.getLogger(DemoJob.class); |
| 76 | +
|
| 77 | + @Override |
| 78 | + protected void executeInternal(JobExecutionContext context) throws JobExecutionException { |
| 79 | + logger.info("定时任务Job Key : {}", context.getJobDetail().getKey()); |
| 80 | + logger.info("定时任务执行时所携带的参数:{}", JSON.toJSONString(context.getJobDetail().getJobDataMap())); |
| 81 | + //...处理逻辑 |
| 82 | + } |
| 83 | +} |
| 84 | +``` |
| 85 | + |
| 86 | + |
| 87 | + |
| 88 | +#### 任务参数 |
| 89 | + |
| 90 | +在任务执行时传递参数是必须的,`ApiBoot Quartz`提供了比较方便的传递方式,不过最终`Quartz`会把传递的值都会转换为`String`类型数据。 |
| 91 | + |
| 92 | +#### 任务Key默认值 |
| 93 | + |
| 94 | +`ApiBoot Quartz`的`newJob`方法所创建的定时任务,如果在不传递`Job Key`参数时,会默认使用`UUID`随机字符串作为`Job Key`以及`Trigger Key`。 |
| 95 | + |
| 96 | +#### 自定义任务开始时间 |
| 97 | + |
| 98 | +任务开始时间可以通过`startAtTime`方法进行设置,在不设置的情况下,任务创建完成后会立刻执行。 |
| 99 | + |
| 100 | +#### Cron 表达式任务 |
| 101 | + |
| 102 | +创建`Cron`类型任务如下所示: |
| 103 | + |
| 104 | +```java |
| 105 | +String jobKey = apiBootQuartzService.newJob(ApiBootCronJobWrapper.Context() |
| 106 | + .jobClass(DemoJob.class) |
| 107 | + .cron("0/5 * * * * ?") |
| 108 | + .param( |
| 109 | + ApiBootJobParamWrapper.wrapper().put("param", "测试")) |
| 110 | + .wrapper()); |
| 111 | +``` |
| 112 | + |
| 113 | +Cron 表达式任务由`ApiBootCronJobWrapper`类进行构建。 |
| 114 | + |
| 115 | +上面的`DemoJob`任务类将会每隔`5秒`执行一次。 |
| 116 | + |
| 117 | +#### Loop 重复任务 |
| 118 | + |
| 119 | +`Loop`循环任务,当在不传递重复执行次数时,不进行重复执行,仅仅执行一次,如下所示: |
| 120 | + |
| 121 | +```java |
| 122 | +String jobKey = apiBootQuartzService.newJob( |
| 123 | + ApiBootLoopJobWrapper.Context() |
| 124 | + // 参数 |
| 125 | + .param( |
| 126 | + ApiBootJobParamWrapper.wrapper() |
| 127 | + .put("userName", "恒宇少年") |
| 128 | + .put("userAge", 24) |
| 129 | + ) |
| 130 | + // 每次循环的间隔时间,单位:毫秒 |
| 131 | + .loopIntervalTime(2000) |
| 132 | + // 循环次数 |
| 133 | + .repeatTimes(5) |
| 134 | + // 开始时间,10秒后执行 |
| 135 | + .startAtTime(new Date(System.currentTimeMillis() + 10000)) |
| 136 | + // 任务类 |
| 137 | + .jobClass(DemoJob.class) |
| 138 | + .wrapper() |
| 139 | + ); |
| 140 | +``` |
| 141 | + |
| 142 | +Loop 任务由`ApiBootLoopJobWrapper`类进行构建。 |
| 143 | + |
| 144 | +上面的定时任务将会重复执行`5次`,连上自身执行的一次也就是会执行`6次`,每次的间隔时间为`2秒`,在任务创建`10秒`后进行执行。 |
| 145 | + |
| 146 | +#### Once 一次性任务 |
| 147 | + |
| 148 | +`Once`一次性任务,任务执行一次会就会被自动释放,如下所示: |
| 149 | + |
| 150 | +```java |
| 151 | +
|
| 152 | +Map paramMap = new HashMap(1); |
| 153 | +paramMap.put("paramKey", "参数值"); |
| 154 | +
|
| 155 | +String jobKey = apiBootQuartzService.newJob( |
| 156 | + ApiBootOnceJobWrapper.Context() |
| 157 | + .jobClass(DemoJob.class) |
| 158 | + // 参数 |
| 159 | + .param( |
| 160 | + ApiBootJobParamWrapper.wrapper() |
| 161 | + .put("mapJson", JSON.toJSONString(paramMap)) |
| 162 | + ) |
| 163 | + // 开始时间,2秒后执行 |
| 164 | + .startAtTime(new Date(System.currentTimeMillis() + 2000)) |
| 165 | + .wrapper() |
| 166 | +); |
| 167 | +
|
| 168 | +``` |
| 169 | + |
| 170 | +Once 任务由`ApiBootOnceJobWrapper`类进行构建。 |
| 171 | + |
| 172 | +在参数传递时可以是对象、集合,不过需要进行转换成字符串才可以进行使用。 |
| 173 | + |
| 174 | +### 暂停任务执行 |
| 175 | + |
| 176 | +任务在执行过程中可以进行暂停操作,通过`ApiBoot Quartz`提供的`pauseJob`方法就可以很简单的实现,当然暂停时需要传递`Job Key`,`Job Key`可以从创建任务方法返回值获得。 |
| 177 | + |
| 178 | +暂停任务如下所示: |
| 179 | + |
| 180 | +```java |
| 181 | +// 暂停指定Job Key的任务 |
| 182 | +apiBootQuartzService.pauseJob(jobKey); |
| 183 | +// 暂停多个执行中任务 |
| 184 | +apiBootQuartzService.pauseJobs(jobKey,jobKey,jobKey); |
| 185 | +``` |
| 186 | + |
| 187 | +### 恢复任务执行 |
| 188 | + |
| 189 | +任务执行完暂停后,如果想要恢复可以使用如下方式: |
| 190 | + |
| 191 | +```java |
| 192 | +// 恢复指定Job Key的任务执行 |
| 193 | +apiBootQuartzService.resumeJob(jobKey); |
| 194 | +// 恢复多个暂停任务 |
| 195 | +apiBootQuartzService.resumeJobs(jobKey,jobKey,jobKey); |
| 196 | +``` |
| 197 | + |
| 198 | + |
| 199 | + |
| 200 | +### 修改Cron表达式 |
| 201 | + |
| 202 | +修改`Cron`表达式的场景如下: |
| 203 | + |
| 204 | +- 已创建 & 未执行 |
| 205 | +- 已创建 & 已执行 |
| 206 | + |
| 207 | +修改方法如下所示: |
| 208 | + |
| 209 | +```java |
| 210 | +// 修改执行Job Key任务的Cron表达式 |
| 211 | +apiBootQuartzService.updateJobCron(jobKey, "0/5 * * * * ?"); |
| 212 | +``` |
| 213 | + |
| 214 | + |
| 215 | + |
| 216 | +### 删除任务 |
| 217 | + |
| 218 | +想要手动释放任务时可以使用如下方式: |
| 219 | + |
| 220 | +```java |
| 221 | +// 手动删除指定Job Key任务 |
| 222 | +apiBootQuartzService.deleteJob(jobKey); |
| 223 | +// 手动删除多个任务 |
| 224 | +apiBootQuartzService.deleteJobs(jobKey,jobKey,jobKey); |
| 225 | +``` |
| 226 | + |
| 227 | +删除任务的顺序如下: |
| 228 | + |
| 229 | +1. 暂停触发器 |
| 230 | +2. 移除触发器 |
| 231 | +3. 删除任务 |
0 commit comments