Skip to content

Commit 19cd3bc

Browse files
committed
添加ApiBoot Quartz示例
1 parent 26a02ca commit 19cd3bc

29 files changed

+4534
-1
lines changed
Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
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. 删除任务
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>api-boot-samples</artifactId>
7+
<groupId>org.minbox.framework</groupId>
8+
<version>1.0.2.RELEASE</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>api-boot-sample-quartz</artifactId>
13+
<dependencies>
14+
<!--web-->
15+
<dependency>
16+
<groupId>org.springframework.boot</groupId>
17+
<artifactId>spring-boot-starter-web</artifactId>
18+
</dependency>
19+
20+
<!--ApiBoot Security Oauth-->
21+
<dependency>
22+
<groupId>org.minbox.framework</groupId>
23+
<artifactId>api-boot-starter-quartz</artifactId>
24+
</dependency>
25+
26+
27+
<dependency>
28+
<groupId>mysql</groupId>
29+
<artifactId>mysql-connector-java</artifactId>
30+
</dependency>
31+
<dependency>
32+
<groupId>com.alibaba</groupId>
33+
<artifactId>druid-spring-boot-starter</artifactId>
34+
</dependency>
35+
<!--可以更换为mybatis或者jpa,自行替换orm框架-->
36+
<dependency>
37+
<groupId>com.gitee.hengboy</groupId>
38+
<artifactId>spring-boot-starter-mybatis-enhance</artifactId>
39+
</dependency>
40+
</dependencies>
41+
<!--ApiBoot版本依赖-->
42+
<dependencyManagement>
43+
<dependencies>
44+
<dependency>
45+
<groupId>org.minbox.framework</groupId>
46+
<artifactId>api-boot-dependencies</artifactId>
47+
<version>1.0.2.RELEASE</version>
48+
<type>pom</type>
49+
<scope>import</scope>
50+
</dependency>
51+
</dependencies>
52+
</dependencyManagement>
53+
</project>

0 commit comments

Comments
 (0)