调用xxljob API创建任务

1、pom依赖

<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 -->
<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.47</version>
</dependency>

2、创建相关类

创建bean
import lombok.Data;

@Data
public class XxlJobInfoBO {
    /**
     * 主键ID
     */
    private Integer id;
    /**
     * 执行器主键ID
     */
    private Integer jobGroup;

    /**
     * 任务描述
     */
    private String jobDesc;
    /**
     * 负责人
     */
    private String author;
    /**
     * 报警邮件
     */
    private String alarmEmail;
    /**
     * 调度类型
     */
    private String scheduleType;
    /**
     * Cron
     */
    private String scheduleConf;

    /**
     * 执行器,任务Handler名称
     */
    private String executorHandler;
    /**
     * 执行器,任务参数
     */
    private String executorParam;
    /**
     * 执行器路由策略
     */
    private String executorRouteStrategy;
    /**
     * 调度过期策略  DO_NOTHING
     */
    private String misfireStrategy;
    /**
     * 阻塞处理策略   SERIAL_EXECUTION
     */
    private String executorBlockStrategy;
    private int executorTimeout;          // 任务执行超时时间,单位秒
    private int executorFailRetryCount;       // 失败重试次数


    /**
     * 运行模式 GLUE类型   #com.xxl.job.core.glue.GlueTypeEnum
     */
    private String glueType;
    private String childJobId;        // 子任务ID,多个逗号分隔
    private String glueSource;        // GLUE源代码
    private String glueRemark;        // GLUE备注


}

创建配置类
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;


@Configuration
public class XxlJobClientConfig {

    @Value("${xxl.job.client.loginUrl:${xxl.job.admin.addresses}/login?userName=admin&password=123456}")
    private String loginUrl;
    @Value("${xxl.job.client.addUrl:${xxl.job.admin.addresses}/jobinfo/add}")
    private String jobInfoAddUrl;
    @Value("${xxl.job.client.deleteUrl:${xxl.job.admin.addresses}/jobinfo/remove?id=%s}")
    private String jobInfoDeleteUrl;
    @Value("${xxl.job.client.startJobUrl:${xxl.job.admin.addresses}/jobinfo/start?id=%s}")
    private String jobInfoStartJobUrl;
    @Value("${xxl.job.client.stopJobUrl:${xxl.job.admin.addresses}/jobinfo/stop?id=%s}")
    private String jobInfoStopJobUrl;
    @Value("${xxl.job.client.updateUrl:${xxl.job.admin.addresses}/jobinfo/update}")
    private String jobInfoUpdateUrl;
    @Value("${xxl.job.client.loadByIdUrl:${xxl.job.admin.addresses}/jobinfo/loadById/%s}")
    private String jobInfoLoadByIdUrl;
    /**
     * 任务列表
     */
    @Value("${xxl.job.client.jobInfoPageListUrl:${xxl.job.admin.addresses}/jobinfo/pageList}")
    private String jobInfoPageListUrl;
    /**
     * 执行器列表
     */
    @Value("${xxl.job.client.jobGroupPageListUrl:${xxl.job.admin.addresses}/jobgroup/pageList}")
    private String jobGroupPageListUrl;
    /**
     * 执行器创建 URL
     */
    @Value("${xxl.job.client.jobGroupSaveUrl:${xxl.job.admin.addresses}/jobgroup/save")
    private String jobGroupSaveUrl;
    
    
    
    
    public String getLoginUrl() {
        return loginUrl;
    }

    public void setLoginUrl(String loginUrl) {
        this.loginUrl = loginUrl;
    }

    public String getJobInfoAddUrl() {
        return jobInfoAddUrl;
    }

    public void setJobInfoAddUrl(String jobInfoAddUrl) {
        this.jobInfoAddUrl = jobInfoAddUrl;
    }

    public String getJobInfoDeleteUrl() {
        return jobInfoDeleteUrl;
    }

    public void setJobInfoDeleteUrl(String jobInfoDeleteUrl) {
        this.jobInfoDeleteUrl = jobInfoDeleteUrl;
    }

    public String getJobInfoStartJobUrl() {
        return jobInfoStartJobUrl;
    }

    public void setJobInfoStartJobUrl(String jobInfoStartJobUrl) {
        this.jobInfoStartJobUrl = jobInfoStartJobUrl;
    }

    public String getJobInfoStopJobUrl() {
        return jobInfoStopJobUrl;
    }

    public void setJobInfoStopJobUrl(String jobInfoStopJobUrl) {
        this.jobInfoStopJobUrl = jobInfoStopJobUrl;
    }

    public String getJobInfoUpdateUrl() {
        return jobInfoUpdateUrl;
    }

    public void setJobInfoUpdateUrl(String jobInfoUpdateUrl) {
        this.jobInfoUpdateUrl = jobInfoUpdateUrl;
    }

    public String getJobInfoLoadByIdUrl() {
        return jobInfoLoadByIdUrl;
    }

    public void setJobInfoLoadByIdUrl(String jobInfoLoadByIdUrl) {
        this.jobInfoLoadByIdUrl = jobInfoLoadByIdUrl;
    }

    public String getJobInfoPageListUrl() {
        return jobInfoPageListUrl;
    }

    public void setJobInfoPageListUrl(String jobInfoPageListUrl) {
        this.jobInfoPageListUrl = jobInfoPageListUrl;
    }

    public String getJobGroupPageListUrl() {
        return jobGroupPageListUrl;
    }

    public void setJobGroupPageListUrl(String jobGroupPageListUrl) {
        this.jobGroupPageListUrl = jobGroupPageListUrl;
    }

    public String getJobGroupSaveUrl() {
        return jobGroupSaveUrl;
    }

    public void setJobGroupSaveUrl(String jobGroupSaveUrl) {
        this.jobGroupSaveUrl = jobGroupSaveUrl;
    }

    @Override
    public String toString() {
        return "XxlJobClientConfigProperties{" +
                "loginUrl='" + loginUrl + '\'' +
                ", jobInfoAddUrl='" + jobInfoAddUrl + '\'' +
                ", jobInfoDeleteUrl='" + jobInfoDeleteUrl + '\'' +
                ", jobInfoStartJobUrl='" + jobInfoStartJobUrl + '\'' +
                ", jobInfoStopJobUrl='" + jobInfoStopJobUrl + '\'' +
                ", jobInfoUpdateUrl='" + jobInfoUpdateUrl + '\'' +
                ", jobInfoLoadByIdUrl='" + jobInfoLoadByIdUrl + '\'' +
                ", jobInfoPageListUrl='" + jobInfoPageListUrl + '\'' +
                ", jobGroupPageListUrl='" + jobGroupPageListUrl + '\'' +
                '}';
    }
}
创建XxlJobClient
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@Component
public class XxlJobClient {
    private String COOKIE ="";
    private HttpClient httpClient;
    private static final String POST_FORM_CONTENT_TYPE = "application/x-www-form-urlencoded; charset=UTF-8";
    private static final Header POST_FORM_CONTENT_TYPE_HEADER = new Header("Content-Type",POST_FORM_CONTENT_TYPE);
    @Autowired
    private XxlJobClientConfig clientConfig;

    private final Logger log = LoggerFactory.getLogger(getClass());


    @PostConstruct
    public void init() throws IOException {
        log.debug("xxl JOB 初始化配置:{}",clientConfig.toString());
        httpClient = new HttpClient();
        login();
    }

    /**
     * 登录获取 cookie
     * @throws IOException
     */
    private void login() throws IOException {
        HttpMethod postMethod = new PostMethod(clientConfig.getLoginUrl());
        httpClient.executeMethod(postMethod);
        if (postMethod.getStatusCode() == 200) {
            Cookie[] cookies = httpClient.getState().getCookies();
            StringBuilder tmpCookies = new StringBuilder();
            for (Cookie c : cookies) {
                tmpCookies.append(c.toString()).append(";");
            }
            COOKIE = tmpCookies.toString();
            log.debug("xxlJob 登录成功");
        }else {
            log.debug("xxlJob 登录失败:{}",postMethod.getStatusCode());
        }
    }

    /**
     * 创建任务
     * @param params
     * @return
     * @throws IOException
     */
    public JSONObject createJob(JSONObject params) throws IOException {
        return doPost(clientConfig.getJobInfoAddUrl(), params);
    }

    /**
     * 更新任务
     * @param params
     * @return
     * @throws IOException
     */
    public JSONObject updateJob(JSONObject params) throws IOException {
        return doPost(clientConfig.getJobInfoUpdateUrl(), params);
    }

    /**
     * 根据任务 ID 加载
     * @param id
     * @return
     * @throws IOException
     */
    public JSONObject loadById(int id) throws IOException {
        log.info("loadById: {}",id);
        return doGet(String.format(clientConfig.getJobInfoLoadByIdUrl(),id));
    }
    /**
     * 删除任务
     * @param id 任务 ID
     * @return
     * @throws IOException
     */
    public JSONObject deleteJob(int id) throws IOException {
        log.info("deleteJob: {}",id);
        return doGet(String.format(clientConfig.getJobInfoDeleteUrl(),id));
    }

    /**
     * 开启任务
     * @param id 任务 ID
     * @return
     * @throws IOException
     */
    public JSONObject startJob(int id) throws IOException {
        log.info("startJob: {}",id);
        return doGet(String.format(clientConfig.getJobInfoStartJobUrl(),id));
    }

    /**
     * 停止任务
     * @param id 任务 ID
     * @return
     * @throws IOException
     */
    public JSONObject stopJob(int id) throws IOException {
        log.info("stopJob: {}",id);
        return doGet(String.format(clientConfig.getJobInfoStopJobUrl(),id));
    }




    /**
     * 创建执行器
     * @param params
     * @return
     * @throws IOException
     */
    public JSONObject createJobGroup(JSONObject params) throws IOException {
        return doPost(clientConfig.getJobGroupSaveUrl(), params);
    }

    /**
     * 执行器列表
     * @param params
     * @return
     * @throws IOException
     */
    public JSONObject jobGroupPageList(JSONObject params) throws IOException {
        params.put("start",Optional.ofNullable(params.getInteger("start")).orElse(0));
        params.put("length", Optional.ofNullable(params.getInteger("length")).orElse(10));
        return doPost(clientConfig.getJobGroupPageListUrl(),params);
    }

    /**
     * 任务列表
     * @param params
     * @return
     * @throws IOException
     */
    public JSONObject jobInfoPageList(JSONObject params) throws IOException {
        params.put("start",Optional.ofNullable(params.getInteger("start")).orElse(0));
        params.put("length", Optional.ofNullable(params.getInteger("length")).orElse(10));
        return doPost(clientConfig.getJobInfoPageListUrl(),params);
    }

    /**
     * 发起 GET 请求
     * @param url
     * @return
     * @throws IOException
     */
    private JSONObject doGet(String url) throws IOException {
        GetMethod get = new GetMethod(url);
        get.setRequestHeader("cookie", COOKIE);
        httpClient.executeMethod(get);
        return readResponse(get);
    }

    /**
     * post 请求
     * @param url
     * @param params
     * @return
     * @throws IOException
     */
    private JSONObject doPost(String url,JSONObject params) throws IOException {
        PostMethod post = new PostMethod(url);
        post.setRequestHeader("cookie", COOKIE);
        List<NameValuePair> pairList = new ArrayList<>();
        params.forEach((k,v)-> pairList.add(new NameValuePair(k, v.toString())));
        NameValuePair[] arr = pairList.toArray(new NameValuePair[0]);
        post.setRequestBody(arr);
        post.setRequestHeader(POST_FORM_CONTENT_TYPE_HEADER);
        httpClient.executeMethod(post);
        return readResponse(post);
    }

    /**
     * 处理响应内容
     * @param httpMethod
     * @return
     * @throws IOException
     */
    private JSONObject readResponse(HttpMethod httpMethod) {
        if (httpMethod.getStatusCode() == HttpStatus.SC_OK) {
            try (InputStream inputStream = httpMethod.getResponseBodyAsStream();
                 InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                 BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
                return JSON.parseObject(bufferedReader.lines().collect(Collectors.joining(System.lineSeparator())));
            } catch (IOException e) {
                log.error("读取响应失败:{}", e.getMessage(), e);
                JSONObject error = new JSONObject();
                error.put("code",HttpStatus.SC_INTERNAL_SERVER_ERROR);
                error.put("msg","响应内容读取失败:"+e.getMessage());
                return error;
            }
        }
        return new JSONObject();
    }
}

创建application.yml配置

xxl:
  job:
    admin:
      addresses: http://ip:port/xxl-job-admin
    client:
      userName: admin
      password: 123456
      loginUrl: ${xxl.job.admin.addresses}/login?userName=${xxl.job.client.userName}&password=${xxl.job.client.password}
      addUrl: ${xxl.job.admin.addresses}/jobinfo/add
      deleteUrl: ${xxl.job.admin.addresses}/jobinfo/remove?id=%s
      startJobUrl: ${xxl.job.admin.addresses}/jobinfo/start?id=%s
      stopJobUrl: ${xxl.job.admin.addresses}/jobinfo/stop?id=%s

3、测试

public static void main(String[] args) {
    try {

        XxlJobClient xxlJobClient = new XxlJobClient();
        XxlJobInfoBO info = new XxlJobInfoBO();

        info.setJobGroup(1);
        info.setJobDesc("测试Api");
        info.setAuthor("测试Api");


        info.setScheduleType("CRON");
        info.setScheduleConf("0 0 0 * * ?");

        info.setGlueType(GlueTypeEnum.BEAN.getDesc());
        info.setExecutorHandler("testJob");


        info.setExecutorRouteStrategy("FIRST");
        info.setMisfireStrategy("DO_NOTHING");
        info.setExecutorBlockStrategy("SERIAL_EXECUTION");

        // 省略其他参数
        com.alibaba.fastjson2.JSONObject jobInfo = com.alibaba.fastjson2.JSONObject.parseObject(com.alibaba.fastjson2.JSON.toJSONString(info));
        com.alibaba.fastjson2.JSONObject creatResult = xxlJobClient.createJob(jobInfo);

        System.out.println("创建成功" + JSON.toJSONString(creatResult));

        Integer content = creatResult.getInteger("content");

        com.alibaba.fastjson2.JSONObject jsonObject = xxlJobClient.startJob(content + 1);
        System.out.println("启动成功" + JSON.toJSONString(jsonObject));


    } catch (IOException e) {
        e.printStackTrace();
    }
}

以上亲测成功,有问题欢迎指出,交流

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值