当前位置:首页 > 科技新闻 > Windows编程 > 正文

xxljob 基于api 添加job
2021-09-04 10:30:11

目前官方没有直接提供类似执行器那种能力,如果需要动态创建job 有几种解决方法

解决方法

  • 修改官方的admin 代码暴露类似admin 的能力
  • 基于官方web的api 进行操作
  • 直接基于数据库操作(可行,而且更加简单)

以下说明基于官方的web api 的操作说明

参考代码

就有okhttp3,操作流程,获取cookie,添加cookie 请求接口

package com.dalong;
 
import com.xxl.job.core.biz.model.ReturnT;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
 
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;
 
public class XxlJobApi {
    public static OkHttpClient  client(){
        OkHttpClient client  =new  OkHttpClient().newBuilder().build();
        return  client;
    }
    public  static ReturnT<String> submitJob() {
        OkHttpClient client = client();
        /**
         *
         jobGroup: 1
         jobDesc: sss
         author: ssss
         alarmEmail:
         scheduleType: FIX_RATE
         scheduleConf: 111
         cronGen_display:
         schedule_conf_CRON:
         schedule_conf_FIX_RATE: 111
         schedule_conf_FIX_DELAY:
         glueType: BEAN
         executorHandler: demoJobHandler
         executorParam:
         executorRouteStrategy: FIRST
         childJobId:
         misfireStrategy: DO_NOTHING
         executorBlockStrategy: SERIAL_EXECUTION
         executorTimeout: 0
         executorFailRetryCount: 0
         glueRemark: GLUE代码初始化
         glueSource:
         */
        // 基于map 包装formbody, 这样我们的数据是可以直接存储在db中的(mongo是一个不错的选择)
        Map<String,String> info = new HashMap<>();
        info.put("jobGroup","1");
        info.put("jobDesc","demo");
        info.put("cronGen_display","");
        info.put("glueType","BEAN");
        info.put("executorHandler","demoJobHandler");
        info.put("author","dalong");
        info.put("executorRouteStrategy","FIRST");
        info.put("triggerStatus","1");
        info.put("misfireStrategy","DO_NOTHING");
        info.put("executorBlockStrategy","SERIAL_EXECUTION");
        info.put("scheduleType","FIX_RATE");
        info.put("scheduleConf","11");
        FormBody.Builder builder = new FormBody.Builder();
 
       info.entrySet().forEach(new Consumer<Map.Entry<String, String>>() {
           @Override
           public void accept(Map.Entry<String, String> stringStringEntry) {
               builder.add(stringStringEntry.getKey(),stringStringEntry.getValue());
           }
       });
        try {
            FormBody formBody2 = new FormBody.Builder()
                    .add("userName", "<user>")
                    .add("password", "<password>")
                    .build();
         Request request=   new Request.Builder().post(formBody2).url("http://localhost/xxl-job-admin/login").build();
         Response response=   client.newCall(request).execute();
         String token = response.header("Set-Cookie"); 
        // 首先获取token 基于cookie
        // 然后请求头附带cookie进行操作
         Request request2= new  Request.Builder().addHeader("Cookie",token).post(builder.build()).url("http://localhost/xxl-job-admin/jobinfo/add").build();
         Response response2=    client.newCall(request2).execute();
         return new ReturnT<>(response2.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return  null;
    }
}

说明

以上代码是基于okhttp3包装的请求处理,改造官方的代码也是一个不错的选择,因为官方目前暴露的一些能力不是特别方便
直接进行数据库的操作也是一个不错的选择(亲测可行),我们直接使用jdbc 进行包装操作就可以了(直接复用官方的mybatis代码就可以了)

 

本文摘自 :https://blog.51cto.com/r