XXL-Job动态添加任务_筏镜的博客-CSDN博客_xxljob动态添加任务

前言

最近项目中涉及到了定时任务相关需求,最终选择了分布式任务调度框架xxl-job,由于我们在使用xxl-job。这里对xxl-job 一些使用做一下简单介绍。

手动定时任务

xxl-job 主要分为一个展示web的独立服务,另外一个是我们项目引入xxl-job依赖,对定时任务做监听。这里不对xxl-job 部署独立服务做介绍,主要介绍如何引入xxl-job依赖进行创建定时任务。

一、配置yml

# 定时任务中心配置信息
job:
  server:
    enabled: true
    # 校验令牌,和服务器保持一致
    accessToken: accessToken
    userName: admin
    password: xxx
    jobGroup: 1
    admin:
      # 定时任务中心地址,通过环境变量取值,(预发布环境需填写预发布的域名,不然会调到开发环境的服务)
      addresses: https://job-centerxx.com
    executor:
      # 执行器名称
      appname: middle-executor
      # 执行器的注册地址
      address:

二、xxl-job 依赖

  <!-- xxl-job-core -->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.3.0</version>
        </dependency>

三、xxl-job 启动

@Slf4j
@Configuration
@Getter
public class JobServerConfig {

    @Value("${job.server.admin.addresses}")
    private String adminAddresses;

    @Value("${job.server.accessToken}")
    private String accessToken;

    @Value("${job.server.executor.appname}")
    private String appname;

    @Value("${job.server.executor.address}")
    private String address;

    @Value("${job.server.userName}")
    private String userName;

    @Value("${job.server.password}")
    private String password;

    @Value("${job.server.jobGroup}")
    private String jobGroup;

    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        log.info(">>>>>>>>>>> job-server config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setAccessToken(accessToken);

        return xxlJobSpringExecutor;
    }
}

四、xxl-job 定时任务处理


    /**
     * 工单生成
     */
    @XxlJob("patrolGenerateHandler")
    public void maintenanceBeginNoticeHandler() {
        long taskId = 0;
        try {
            String param = XxlJobHelper.getJobParam();
            taskId = Long.parseLong(param);
            System.out.println("工单生成");
        } catch (Exception e) {
            log.error("patrolGenerateHandler fail taskId is {}", taskId, e);
        }

    }

五、web端配置对应的定时任务
在这里插入图片描述

此时一个xxl-job 的定时任务就建立起来。

动态添加任务

动态添加定时任务主要模拟web页面的具体操作步骤,这里先给出一个思路。不同web配置端的版本版本可能不一致,如果参数和本实例那么我们将页面上面接口和参数拷贝到代码中,进行对应http操作
在这里插入图片描述
这里的代码都是对这个页面上模拟,如果按照下面案例有什么不一致,可以在将web页面的参数考入代码中。

这里主要提供三个接口(一个是创建定时任务,一个是启动定时任务,另外一个删除定时任务)这里的代码通过一个数据库来管理启动定时任务情况,这里所有定时任务都是通过patrolGenerateHandler 来处理,如果标识该处理是那个定时任务这里主要通过param来分辨。

@Service
public class DynamicXxlJobService {

    @Resource
    private JobServerConfig jobServerConfig;

    @Resource
    private PatrolJobManageService patrolJobManageService;


    public boolean createTaskJob(String desc, String corn, Long taskId, LocalDateTime expireLocalDateTime, LocalDateTime startLocalDate ){
        Date startDate = Date.from(startLocalDate.atZone(ZoneId.systemDefault()).toInstant());
        Date expireDate = Date.from(expireLocalDateTime.atZone(ZoneId.systemDefault()).toInstant());
        String cookie = getCookie();
        PatrolJobManage curPatrolJobManage = patrolJobManageService.getByTaskId(taskId,corn);
        if(Objects.isNull(curPatrolJobManage)){
            Pair<Integer, Integer> pair = generateStatus(desc, corn, taskId, startLocalDate, cookie);
            int status = pair.getLeft();
            int job = pair.getRight();
            Date date = new Date();
            PatrolJobManage patrolJobManage = PatrolJobManage.builder().cron(corn).jobId(job).status(status).type("patrol_task_generate")
                    .taskId(taskId).startTime(startDate).expireTime(expireDate).createTime(date).updateTime(date).build();
            patrolJobManageService.save(patrolJobManage);
        }else{
            int status = curPatrolJobManage.getStatus();
            StatusEnum statusEnum = StatusEnum.of(status);
            if(statusEnum==StatusEnum.START_JOB || statusEnum==StatusEnum.EXPIRE_JOB){
                return true;
            }
            if (statusEnum==StatusEnum.INIT) {
                Pair<Integer, Integer> pair = generateStatus(desc, corn, taskId, startLocalDate, cookie);
                curPatrolJobManage.setStatus(pair.getLeft());
                curPatrolJobManage.setJobId(pair.getRight());
                curPatrolJobManage.setUpdateTime(new Date());
                patrolJobManageService.updateById(curPatrolJobManage);
            }

            if (statusEnum==StatusEnum.START_JOB && startLocalDate.compareTo(LocalDateTime.now()) <= 0) {
                Integer jobId = curPatrolJobManage.getJobId();
                if (start(cookie, jobId)) {
                    curPatrolJobManage.setStatus(StatusEnum.START_JOB.getCode());
                    curPatrolJobManage.setUpdateTime(new Date());
                    patrolJobManageService.updateById(curPatrolJobManage);
                }
            }
        }

        return true;
    }

    private Pair<Integer, Integer>  generateStatus(String desc, String corn, Long taskId,
                                LocalDateTime startLocalDate,String cookie){
        int job = createJob(cookie, desc, corn, String.valueOf(taskId));
        int status = StatusEnum.INIT.getCode();
        if (job == -1) {
            status = StatusEnum.INIT.getCode();
        } else {
            status = StatusEnum.CREATE_JOB.getCode();
            if (startLocalDate.compareTo(LocalDateTime.now()) <= 0) {
                if (start(cookie, job)) {
                    status = StatusEnum.START_JOB.getCode();
                }
            }
        }

        return Pair.of(status, job);
    }
    /**
     * 创建固定任务
     *
     * @param desc  任务描述
     * @param corn  cron 表达式
     * @param param param
     * @return jobId
     */
    private int createJob(String cookie, String desc, String corn, String param) {

        int jobId = -1;
        Map<String, String> paramMap = new HashMap<>(8);
        paramMap.put("jobGroup", jobServerConfig.getJobGroup());
        paramMap.put("jobDesc", desc);
        paramMap.put("author", "system_patrol");
        paramMap.put("scheduleType", "CRON");
        paramMap.put("scheduleConf", corn);
        paramMap.put("cronGen_display", corn);
        paramMap.put("glueType", "BEAN");
        paramMap.put("executorHandler", "patrolGenerateHandler");
        // 此处hander需提前在项目中定义
        paramMap.put("executorParam", param);
        paramMap.put("executorRouteStrategy", "FIRST");
        paramMap.put("misfireStrategy", "DO_NOTHING");
        paramMap.put("executorBlockStrategy", "SERIAL_EXECUTION");
        paramMap.put("executorTimeout", "0");
        paramMap.put("executorFailRetryCount", "0");
        paramMap.put("glueRemark", "GLUE代码初始化");
        if(StringUtils.isNoneBlank(cookie)){
            cookie = getCookie();
        }
        HashMap<String, String> headMap = new HashMap<>();
        headMap.put("cookie", cookie);
        String s = OkHttpClientUtil.doPost(jobServerConfig.getAdminAddresses() + "/jobinfo/add", paramMap, headMap);
        JSONObject jsonObject = JSON.parseObject(s);
        int code = jsonObject.getIntValue("code");
        if (code == 200) {
            jobId = jsonObject.getIntValue("content");
        }

        return jobId;
    }


    /**
     * 启动固定任务
     * @param cookie cookie
     * @param jobId jobId
     * @return 启动固定任务
     */
    private  boolean start(String cookie,int jobId){
        Map<String, String> paramMap = new HashMap<>(4);
        paramMap.put("id", String.valueOf(jobId));
        HashMap<String, String> headMap = new HashMap<>(4);
        if(StringUtils.isEmpty(cookie)){
            cookie = getCookie();
        }
        headMap.put("cookie", cookie);
        String s = OkHttpClientUtil.doPost(jobServerConfig.getAdminAddresses() + "/jobinfo/start", paramMap, headMap);
        JSONObject jsonObject = JSON.parseObject(s);
        int code = jsonObject.getIntValue("code");
        if (code == 200) {
            return true;
        }
        return false;
    }



    /**
     * 删除固定任务
     * @param cookie cookie
     * @param jobId jobId
     * @return 启动固定任务
     */
    public  boolean remove(String cookie,int jobId){
        Map<String, String> paramMap = new HashMap<>(4);
        paramMap.put("id", String.valueOf(jobId));
        HashMap<String, String> headMap = new HashMap<>(4);
        if(StringUtils.isEmpty(cookie)){
            cookie = getCookie();
        }
        headMap.put("cookie", cookie);
        String s = OkHttpClientUtil.doPost(jobServerConfig.getAdminAddresses() + "/jobinfo/remove", paramMap, headMap);
        JSONObject jsonObject = JSON.parseObject(s);
        int code = jsonObject.getInteger("code");
        if (code == 200) {
            return true;
        }
        return false;
    }

    /**
     * 获取cookie
     * @return 返回cookie值
     */
    public String getCookie() {
        String path = jobServerConfig.getAdminAddresses() + "/login";
        Map<String, Object> hashMap = new HashMap();
        hashMap.put("userName", jobServerConfig.getUserName());
        hashMap.put("password", jobServerConfig.getPassword());
        HttpResponse response = HttpRequest.post(path).form(hashMap).execute();
        List<HttpCookie> cookies = response.getCookies();
        StringBuilder sb = new StringBuilder();
        for (HttpCookie cookie : cookies) {
            sb.append(cookie.toString());
        }
        return sb.toString();
    }

}


原网址: 访问
创建于: 2022-05-19 19:23:39
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论