基于API的调度系统

基于 Quartz.net 的接口调度设计

基于API的调度系统

概念

  1. Job:作业,拥有真正做事的方法 Execute
  2. Trigger:触发器,定义作业什么时候触发
  3. Schedule:调度者,整合 JobTirgger ,启动单位

设计理念

  1. 通过 quartz_jobs.xml 配置 ScheduleJobTirgger
  2. 所有 Job 的实际业务实现由服务端开发
  3. 实现 Job 基类 ApiJob, 默认实现读取 quartz_jobs.xml 中配置的 Job,提取其中 <job-data-map> 节点进行接口调用
  4. 基于 ApiJob 提供了 ApiSingleThreadJobApiMultiThreadJob,普通需求可基于这两个作业配置xml。
    • ApiSingleThreadJob: 单线程作业,用于避免并发导致的问题
    • ApiMultiThreadJob:多线程作业

开发方法

以下示例定义作业 SampleJob<job-type>ApiMultiThreadJob ,从每个小时的 0秒 开始,间隔 15秒 调用一次获取客户分布的接口

  1. 配置 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>
  2. 保存 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

  1. job

    • name: 作业名称
    • group:分组名称
    • job-type:job类的程序集全名称
    • job-data-map:自定义 key-value 格式的数据,Scheduler 定义了如下 key,按需配置:

      • ContentType:取值 FormUrlEncoded / Json
      • RequestUrl: 请求的url
      • Method: 取值 Get / Post
      • Header:headerkey: headerkey 可替换为任何需要的 Header 键。可以有多个 headerkey 不同的 Header:headerkey
      • Timeut: 超时时间,单位s
      • JsonParam: 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>
  2. 其他