基于API的调度系统
概念
- Job:作业,拥有真正做事的方法
Execute
- Trigger:触发器,定义作业什么时候触发
- Schedule:调度者,整合
Job
和Tirgger
,启动单位
设计理念
- 通过
quartz_jobs.xml
配置Schedule
、Job
和Tirgger
- 所有
Job
的实际业务实现由服务端开发 - 实现
Job
基类ApiJob
, 默认实现读取quartz_jobs.xml
中配置的Job
,提取其中<job-data-map>
节点进行接口调用 - 基于
ApiJob
提供了ApiSingleThreadJob
及ApiMultiThreadJob
,普通需求可基于这两个作业配置xml。ApiSingleThreadJob
: 单线程作业,用于避免并发导致的问题ApiMultiThreadJob
:多线程作业
开发方法
以下示例定义作业 SampleJob
,<job-type>
为 ApiMultiThreadJob
,从每个小时的 0秒
开始,间隔 15秒
调用一次获取客户分布的接口
配置
quartz_jobs.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53<schedule>
<job>
<name>sampleJob</name>
<group>sampleGroup</group>
<description>Sample job for Quartz Server</description>
<job-type>Scheduler.Jobs.ApiMultiThreadJob, Scheduler</job-type>
<durable>true</durable>
<recover>false</recover>
<job-data-map>
<entry>
<key>ContentType</key>
<value>Json</value>
</entry>
<entry>
<key>RequestUrl</key>
<value>http://127.0.0.1/api/home/customer/getDistributionList</value>
</entry>
<entry>
<key>Method</key>
<value>Post</value>
</entry>
<entry>
<key>Timeout</key>
<value>25</value>
</entry>
<entry>
<key>JsonParam</key>
<value>
{
"body":
{
"longitude":113.378723,
"latitude":23.129471,
"ZoomLevelType":3
}
}
</value>
</entry>
</job-data-map>
</job>
<trigger>
<cron>
<name>sampleCronTrigger</name>
<group>sampleCronGroup</group>
<description>Cron trigger to simply fire sample job</description>
<job-name>sampleJob</job-name>
<job-group>sampleGroup</job-group>
<misfire-instruction>SmartPolicy</misfire-instruction>
<cron-expression>0/10 * * * * ?</cron-expression>
</cron>
</trigger>
</schedule>保存
quartz_jobs.xml
,24小时内生效。
发布与安装
Scheduler 将最终生成的 exe
封装为可通过命令行安装的可执行程序。
- 常用命令:
- 安装: `Scheduler.exe install`
- 卸载: `Scheduler.exe uninstall`
- 开启服务:`Scheduler.exe start`
- 停止服务:`Scheduler.exe stop`
- 查看帮助:`Scheduler.exe help`
- (第一次)发布安装步骤(后续将结合 `Jenkins` 自动构建):
1. 停止服务
1. 文件系统方式发布,覆盖到原来的安装位置
1. 重新启动服务
- 第一次安装之后的普通发布,仅需修改配置 `quartz_jobs.xml`
quartz_jobs.xml
job
- name: 作业名称
- group:分组名称
- job-type:job类的程序集全名称
job-data-map:自定义 key-value 格式的数据,Scheduler 定义了如下
key
,按需配置:ContentType
:取值FormUrlEncoded
/Json
RequestUrl
: 请求的urlMethod
: 取值Get
/Post
Header:headerkey
: headerkey 可替换为任何需要的 Header 键。可以有多个 headerkey 不同的Header:headerkey
Timeut
: 超时时间,单位sJsonParam
: json请求参数,注意ContentType
要同时取值为Json
1
2
3
4
5
6
7
8
9
10
11
12
13<entry>
<key>JsonParam</key>
<value>
{
"body":
{
"longitude":113.378723,
"latitude":23.129471,
"ZoomLevelType":3
}
}
</value>
</entry>Param:paramkey
: 单个请求参数,paramkey 可替换为任何需要的 参数 键。可以有多个 paramkey 不同的Param:paramkey
。注意ContentType
要同时取值为FormUrlEncoded
1
2
3
4
5
6
7
8
9
10
11
12<entry>
<key>Param:grant_type</key>
<value>password</value>
</entry>
<entry>
<key>Param:username</key>
<value>admin</value>
</entry>
<entry>
<key>Param:password</key>
<value>123456</value>
</entry>
其他