【苍穹开发】后台代码创建调度作业和调度计划原创
金蝶云社区-_哇哈哈
_哇哈哈
7人赞赏了该文章 3,795次浏览 未经作者许可,禁止转载编辑于2021年12月05日 16:21:56
summary-icon摘要由AI智能服务提供

本文介绍了在业务开发中,除了使用线程类外,通过后台代码在苍穹平台创建调度作业和调度计划的方法。首先,说明了如何创建一次性调度任务,包括定义调度作业执行类和创建任务。其次,详述了如何创建关联调度计划的调度作业,执行周期作业,包括创建调度作业、设置参数、创建调度计划并关联作业,以及设置调度计划的开始时间、结束时间、重复周期等。整个过程涉及多个关键类和API的使用。

在业务开发中,经常需要定时执行某些固定的业务,除了使用线程类,业界还有很多支持配置定时作业、定时任务的定时调度框架。

比如:

  1. Quartz

  2. elastic-job

  3. xxx-job


苍穹平台本身提供定时任务功能,位于系统服务云-系统管理-调度管理模块,具体使用在这里就不一一介绍了,有兴趣可以学习下苍穹平台开发相关内容。



下面讲下,如何通过后台代码创建调度作业和调度计划。

一、创建一次性调度任务,执行后台任务

1、创建调度作业执行类

关键类 

kd.bos.schedule.executor.AbstractTask;
import kd.bos.context.RequestContext;
import kd.bos.exception.KDException;
import kd.bos.schedule.executor.AbstractTask;

import java.util.Map;

public class TestTask extends AbstractTask {
   @Override
   public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
       //TODO 执行逻辑
   }
}

2、创建调度作业,并且创建一次性调度任务

关键类

kd.bos.schedule.api.JobInfo
kd.bos.schedule.executor.JobClient

import kd.bos.schedule.api.JobInfo;
import kd.bos.schedule.api.JobType;
import kd.bos.schedule.executor.JobClient;

import java.util.HashMap;
import java.util.Map;

public class TaskDemo {

   private void createOnceJob() {
       Map<String, Object> jobParams = new HashMap<>();
       jobParams.put("param1", "paramvalue");

       JobInfo jobInfo = new JobInfo();
       jobInfo.setNumber("jobnumber");
       jobInfo.setName("jobname");
       jobInfo.setJobType(JobType.BIZ);
       //设置传给作业类的参数
       jobInfo.setParams(jobParams);
       //指定关联的应用
       jobInfo.setAppId("appid");
       //设置调度作业类
       jobInfo.setTaskClassname(TestTask.class.getName());
       //是否并行执行
       jobInfo.setRunConcurrently(true);

       //创建并执行一次性调度任务,不持久化调度作业,前台查询不到,只能看到调度任务
       String taskId = JobClient.dispatch(jobInfo);
   }
}


二、创建关联调度计划的调度作业,执行周期作业

关键类

kd.bos.schedule.api.JobInfo
kd.bos.schedule.api.PlanInfo
kd.bos.schedule.server.JobDispatcherProxy

1、创建调度作业

2、创建调度计划并关联作业


import kd.bos.schedule.api.JobInfo;
import kd.bos.schedule.api.JobType;
import kd.bos.schedule.api.PlanInfo;
import kd.bos.schedule.api.RepeatModeEnum;
import kd.bos.schedule.executor.JobClient;
import kd.bos.schedule.server.JobDispatcherProxy;

import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;

public class TaskDemo {

   private void createScheduleJob() {
       JobDispatcherProxy proxy = new JobDispatcherProxy();
       //1、创建调度作业
       JobInfo jobInfo = new JobInfo();
       jobInfo.setNumber("jobnumber");
       jobInfo.setName("jobname");
       jobInfo.setJobType(JobType.BIZ);
       jobInfo.setParams(null);
       jobInfo.setAppId("appid");
       jobInfo.setTaskClassname(TestTask.class.getName());
       jobInfo.setEnable(true);
       jobInfo.setRunByUserId(0L);
       //创建并持久化调度作业,前台可以看到具体的调度作业,未执行
       String jobId = proxy.createJob(jobInfo);
     
       //2、创建调度计划
       PlanInfo planInfo = new PlanInfo();
       //关联调度作业,jobId为第1步的jobId
       planInfo.setJobId((String) jobId);
       planInfo.setName("name");
       planInfo.setNumber("number");
       //设置调度计划开始时间  自定义时间
       Calendar startTime = Calendar.getInstance();
       planInfo.setStartTime(startTime);
       //设置调度计划结束时间  自定义时间
       Calendar endTime = Calendar.getInstance();
       planInfo.setEndTime(endTime);
       //设置调度计划重复周期
       planInfo.setRepeatMode(RepeatModeEnum.ByDays);
       //设置cron表达式,根据表达式解析重复执行的周期
       planInfo.setCronExpression("0 0 12 * * ?");
       planInfo.setEnable(true);
       //发布调度计划
       proxy.createPlan(planInfo);
   }
}



以上是使用后台代码创建调度作业和调度计划的全过程。如有建议或不足,请联系指正。

赞 7