基础框架-文档中心基础框架-文档中心
使用指南
公共组件
开发测试
  • 微服务框架
  • Vue3框架
  • 项目实践
更新日志
  • V3.3.0
  • V3.2.6
  • V3.2.5
  • V3.2.4
  • V3.1.0
  • V2.2.x
  • V2.1.0
  • V2.0.0
  • V1.2.1
  • V1.1.1
使用指南
公共组件
开发测试
  • 微服务框架
  • Vue3框架
  • 项目实践
更新日志
  • V3.3.0
  • V3.2.6
  • V3.2.5
  • V3.2.4
  • V3.1.0
  • V2.2.x
  • V2.1.0
  • V2.0.0
  • V1.2.1
  • V1.1.1
  • 后端组件

    • waf-license-产品证书授权
    • waf-calcite-动态数据管理
    • 消息中心组件
    • 调度任务组件
    • xxl-job 安装使用
    • API服务
    • 全文检索
  • 前端组件

    • 分页组件
    • 数据字典组件
    • 业务字典组件
    • 人员选择组件
    • 组织机构选择组件
    • 文件上传组件
    • 第三方应用集成

调度任务组件

调度任务模块waf-job,是用于定义系统中的分布式任务接口,提供任务管理服务的模块,调度任务支持自定义扩展,该模块为独立的springboot应用,扩展时也需要新启一个应用来实现。

1、调度任务扩展依赖

<!-- 指定waf-parent为parent,版本号为实际发布的版本-->
<parent>
    <groupId>com.wiseda.waf</groupId>
    <artifactId>waf-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

<!-- 扩展调度任务依赖,版本号不需要指定,继承parent中的版本-->
<dependency>
    <groupId>com.wiseda.waf</groupId>
    <artifactId>waf-job</artifactId>
</dependency>

2、application yml配置

yml文件的配置参照waf-job中的配置进行调整,这里不再进行详细说明,主要是对数据源,redis的配置。

# 调用模块配置(如waf-framwork---> waf-job,则在waf-framwork的yml文件需要配置waf-job的restful地址)
waf:
  api:
    # 调度任务rest服务地址(本地如不需要发送可将值设置为空)
    message-rest-url: http://localhost:8011/waf-job
    #执行器ID(根据xxx-job-admin中的配置生成的ID修改)
    jobGroupId: 2

3、调度任务服务列表

waf-job提供的任务调度API是基于xxx-job-admin的JobInfoController进行的二次封装,封装的接口为是简化调度任务的使用方式。

xxl-job 架构图

1596015328588

分布式调度任务流程图

1610264741226

3.1、基于waf-proxy调用

waf-proxy对waf-job提供的服务进行的再次封装,只需要配置API服务的地址就能进行直接调用,再次做了简化

<!-- 指定waf-parent为parent,版本号为实际发布的版本-->
<parent>
    <groupId>com.wiseda.waf</groupId>
    <artifactId>waf-parent</artifactId>
    <version>1.0.1.RELEASE</version>
</parent>

<!-- 调度任务依赖,版本号不需要指定,继承parent中的版本-->
<dependency>
    <groupId>com.wiseda.waf</groupId>
    <artifactId>waf-job</artifactId>
</dependency>

# 调用模块配置(如waf-framwork---> waf-proxy,则在waf-framwork的yml文件需要配置waf-job的restful地址)
waf:
  api:
    #任务调度API服务
    job-rest-url: http://localhost:8011/waf-job
    #执行器ID(根据xxx-job-admin中的配置生成的ID修改)
    jobGroupId: 2

通过JobInfoClientService实例来调用提供的服务(代码片断如下:)

@Autowired
private JobInfoProxyService jobInfoProxyService;

    @Test
    public void saveJobInfo() throws Exception {
        JobInfo jobInfo = new JobInfo();
        jobInfo.setJobGroup(Integer.parseInt(SpringContextUtils.getPropertis("waf.server.jobGroupId")));
        jobInfo.setJobDesc("测试调度任务-新增");
        jobInfo.setJobCron("0 0/2 * * * ?");
        jobInfo.setExecutorRouteStrategy("FIRST");
        // @XxlJob("metwafHandler")  执行的bean名称
        jobInfo.setExecutorHandler("wafJobHandler");
        jobInfo.setExecutorBlockStrategy("SERIAL_EXECUTION");
        jobInfo.setGlueType("BEAN");
        jobInfo.setAuthor("admin");
        jobInfo.setExecutorParam("{\"userId\":\"test\"}");
        // 调度状态:0-停止,1-运行
        jobInfo.setTriggerStatus(1);
        // 任务超时时间 (秒)
        jobInfo.setExecutorTimeout(100);
        jobInfo.setAlarmEmail("lawmancs@qq.com");
        // 子任务(没有可不设置)
        jobInfo.setChildJobId("6");
        // 失败重试次数
        jobInfo.setExecutorFailRetryCount(2);
        Map retMap = jobInfoProxyService.saveJobInfo(jobInfo);
        LOGGER.info("retMap:{}",retMap);
    }

注意

在waf-parent:2.0之后版本已经移除了waf-proxy,相关的功能整合到waf-common模块中

3.2、基于Restful服务调用

3.2.1、获取调度任务列表

  • 请求方式:GET
  • 接口地址:/v1/jobInfo/pageList
参数参数名称数据类型是否必填描述
start开始页Integer是第一页从0开始
length每页记录数Integer是
jobGroup执行器IDInteger是创建时获取
triggerStatus状态Integer是-1所有;0停止;1启动
jobDesc任务名称String
executorHandler执行bean名称String执行业务逻辑的bean
author负责人String
  • 应答格式:JSON
{
  "code": 200,
  "message": "调用成功!",
  "data":{
    "recordsFiltered": 8,
    "data":[
      {
        "id": 11,
        "jobGroup": 2,
        "jobCron": "0 0/2 * * * ?",
        "jobDesc": "测试调度任务-新增",
        "addTime": 1580697139000,
        "updateTime": 1580699478000,
        "author": "admin",
        "alarmEmail": "lawmancs@qq.com",
        "executorRouteStrategy": "FIRST",
        "executorHandler": "wafJobHandler",
        "executorParam": "{\"userId\":\"test\"}",
        "executorBlockStrategy": "SERIAL_EXECUTION",
        "executorTimeout": 100,
        "executorFailRetryCount": 2,
        "glueType": "BEAN",
        "glueSource": null,
        "glueRemark": null,
        "glueUpdatetime": 1580697139000,
        "childJobId": "6",
        "triggerStatus": 0,
        "triggerLastTime": 0,
        "triggerNextTime": 0
      },
      {"id": 10, "jobGroup": 2, "jobCron": "0 0/2 * * * ?", "jobDesc": "测试调度任务-新增"},
      {"id": 9, "jobGroup": 2, "jobCron": "0 0/2 * * * ?", "jobDesc": "测试任务新增ccc"}
    ],
    "recordsTotal": 8
  }
}

data中的主要属性说明

参数参数名称数据类型描述
id任务IDInteger
jobGroup执行器IDInteger执行器配置的ID
jobCroncron表达式String
jobDesc任务标题String
author责任人String
alarmEmail报警邮件String
executorRouteStrategy路由策略String包括:第一个、最后一个、轮询等
executorHandlerJobHandlerString
executorParam任务参数String
executorBlockStrategy阻塞处理策略String单机串行(默认)、丢弃后续调度等
executorFailRetryCount失败重试次数String
glueType运行模式String
childJobId子任务IDInteger
triggerStatus任务状态Integer0-停止;1-启动
recordsTotal总记录数Integer查询总记录数

3.2.2、获取任务详情

  • 请求方式:GET
  • 接口地址:/v1/jobInfo/{jobId}
参数参数名称数据类型是否必填描述
jobId任务IDString是
  • 应答格式:JSON
{
  "code": 200,
  "message": "调用成功!",
  "data":{
    "id": 4,
    "jobGroup": 2,
    "jobCron": "0 0/2 * * * ?",
    "jobDesc": "测试任务新增2",
    "addTime": "2020-02-01 10:38:02",
    "updateTime": "2020-02-01 17:32:02",
    "author": "admin",
    "alarmEmail": null,
    "executorRouteStrategy": "FIRST",
    "executorHandler": "wafJobHandler",
    "executorParam": null,
    "executorBlockStrategy": "SERIAL_EXECUTION",
    "executorTimeout": 0,
    "executorFailRetryCount": 0,
    "glueType": "BEAN",
    "glueSource": null,
    "glueRemark": null,
    "glueUpdatetime": "2020-02-01 10:38:02",
    "childJobId": null,
    "triggerStatus": 0,
    "triggerLastTime": 0,
    "triggerNextTime": 0
  }
}

data中的主要属性说明

参数参数名称数据类型描述
id任务IDInteger
jobGroup执行器IDInteger执行器配置的ID
jobCroncron表达式String
jobDesc任务标题String
author责任人String
alarmEmail报警邮件String
executorRouteStrategy路由策略String包括:第一个、最后一个、轮询等
executorHandlerJobHandlerString
executorParam任务参数String
executorBlockStrategy阻塞处理策略String单机串行(默认)、丢弃后续调度等
executorFailRetryCount失败重试次数
glueType运行模式String
childJobId子任务IDInteger
triggerStatus任务状态Integer0-停止;1-启动
recordsTotal总记录数Integer查询总记录数

3.2.3、调度任务-新增

  • 请求方式:POST
  • 接口地址:/v1/jobInfo
参数参数名称数据类型是否必填描述
com.wiseda.waf.common.model.job.JobInfo任务对象String是对象属性与2.2中一致
  • 请求格式:JSON
{
  "jobGroup": 2,
  "jobCron": "0 0/2 * * * ?",
  "jobDesc": "测试任务新增",
  "author": "admin",
  "executorRouteStrategy": "FIRST",
  "executorHandler": "wafJobHandler",
  "executorBlockStrategy": "SERIAL_EXECUTION",
  "glueType": "BEAN"
}

请求参数说明

参数参数名称数据类型是否必填描述
jobGroup执行器IDInteger是执行器配置的ID
jobCroncron表达式String是
jobDesc任务标题String是
author责任人String是
alarmEmail报警邮件String否
executorRouteStrategy路由策略String是包括:第一个、最后一个、轮询等
executorHandlerJobHandlerString是
executorParam任务参数String否
executorBlockStrategy阻塞处理策略String是单机串行(默认)、丢弃后续调度等
executorFailRetryCount失败重试次数否
glueType运行模式String是
childJobId子任务IDInteger否
triggerStatus任务状态Integer否0-停止;1-启动
  • 应答格式:JSON
{
  "code": 200,
  "message": "调用成功!",
  "data":{
    "jobId": "15"
  }
}

data参数说明

参数参数名称数据类型描述
jobId任务IDInteger新增返回的任务ID,如需后续修改,启停需保存该ID

3.2.4、调度任务-修改

  • 请求方式:PUT
  • 接口地址:/v1/jobInfo
参数参数名称数据类型是否必填描述
com.wiseda.waf.common.model.job.JobInfo任务对象String是对象属性与2.2中一致
  • 请求格式:JSON
{
  "id": 15,
  "jobGroup": 2,
  "jobCron": "0 0/2 * * * ?",
  "jobDesc": "测试任务新增-修改",
  "author": "admin",
  "executorRouteStrategy": "FIRST",
  "executorHandler": "wafJobHandler",
  "executorBlockStrategy": "SERIAL_EXECUTION",
  "glueType": "BEAN"
}

请求参数说明

参数参数名称数据类型是否必填描述
id任务IDInteger是任务ID
jobGroup执行器IDInteger是执行器配置的ID
jobCroncron表达式String是
jobDesc任务标题String是
author责任人String是
alarmEmail报警邮件String否
executorRouteStrategy路由策略String是包括:第一个、最后一个、轮询等
executorHandlerJobHandlerString是
executorParam任务参数String否
executorBlockStrategy阻塞处理策略String是单机串行(默认)、丢弃后续调度等
executorFailRetryCount失败重试次数否
glueType运行模式String是
childJobId子任务IDInteger否
triggerStatus任务状态Integer否0-停止;1-启动
  • 应答格式:JSON
{
  "code": 200,
  "message": "调用成功!",
  "data": null
}

3.2.5、调度任务-启动

  • 请求方式:PATCH
  • 接口地址:/v1/jobInfo/{jobId}/start
参数参数名称数据类型是否必填描述
jobId任务IDString是
  • 应答格式:JSON
{
  "code": 200,
  "message": "调用成功!",
  "data": null
}

3.2.6、调度任务-暂停

  • 请求方式:PATCH
  • 接口地址:/v1/jobInfo/{jobId}/pause
参数参数名称数据类型是否必填描述
jobId任务IDString是
  • 应答格式:JSON
{
  "code": 200,
  "message": "调用成功!",
  "data": null
}

3.2.7、调度任务-删除

  • 请求方式:DELETE
  • 接口地址:/v1/jobInfo/{jobId}
参数参数名称数据类型是否必填描述
jobId任务IDString是
  • 应答格式:JSON
{
  "code": 200,
  "message": "调用成功!",
  "data": null
}

3.2.8、调度任务-触发一次调度任务

  • 请求方式:PATCH
  • 接口地址:/v1/jobInfo/{jobId}/trigger
参数参数名称数据类型是否必填描述
jobId任务IDString是
executorParam执行参数String否自定义格式,一般采用JSON
  • 应答格式:JSON
{
  "code": 200,
  "message": "调用成功!",
  "data": null
}

3.2.9、调度任务-下次执行时间

  • 请求方式:GET
  • 接口地址:/v1/jobInfo/{jobId}/nextTriggerTime
参数参数名称数据类型是否必填描述
jobId任务IDString是
  • 应答格式:JSON
{
  "code": 200,
  "message": "调用成功!",
  "data":[
    "2020-02-03 18:10:00",
    "2020-02-03 18:12:00",
    "2020-02-03 18:14:00",
    "2020-02-03 18:16:00",
    "2020-02-03 18:18:00"
  ]
}

data中为一组5条后续的任务执行时间

参考资料

https://www.xuxueli.com/xxl-job/

4、项目实际应用

在基础框架中提供了waf-job模块,在waf-porxy中定义的job的restful 接口地址,对于项目中的实际需求场景,建议将waf-job fork到自己的项目中,自行完善实际的业务需求,保持着controll中提供出去的api地址一致,就可以让直接使用waf-proxy定义的job服务,也可以自定去定义。

5、xxl-job 安装应用

xxl-job部署可参照上面链接选择一种来部署。

上次更新: 12/9/22, 8:51 AM
编辑者: 李贤伟
Prev
消息中心组件
Next
xxl-job 安装使用