xxl-job-admin2.3远程调用APi

xxl-job-admin2.3远程调用APi

本文主要描述xxl-job的接口调用实现对job动态增删改查。

代码结构

在这里插入图片描述

一、pom引入

  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.3</version>
    </parent>

    <properties>
        <!-- 项目源码及编译输出的编码 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <!-- 项目编译JDK版本 -->
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>

    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.xuxueli/xxl-job-core -->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.6.3</version>
        </dependency>
    </dependencies>

二、配置文件

# web port
server.port=8088
# no web
#spring.main.web-environment=false

### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin

### xxl-job, access token
xxl.job.accessToken=

### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=9999
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30

#XxlJobTemplate相关新增
xxl.job.admin.username=admin
xxl.job.admin.password=123456

三、相关实体类

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 添加Job
 */
@Data
@Accessors(chain = true)
public class AddXxlJob {
    /**
     * 执行器主键ID
     */
    private int jobGroup;
    /**
     * job描述
     */
    private String jobDesc;
    /**
     * 负责人
     */
    private String author;
    /**
     * 调度类型
     */
    private String scheduleType;
    /**
     * 调度配置,值含义取决于调度类型
     */
    private String scheduleConf;
    /**
     * 执行器,任务Handler名称
     */
    private String executorHandler;
    /**
     * 任务参数
     */
    private String executorParam = "";
}

/**
 * 修改Job
 */
@Data
@Accessors(chain = true)
public class UpdateXxlJob {
    /**
     * 任务id
     */
    private int id;
    /**
     * 执行器主键ID
     */
    private int jobGroup;
    /**
     * job描述
     */
    private String jobDesc;
    /**
     * 负责人
     */
    private String author;
    /**
     * 调度类型
     */
    private String scheduleType;
    /**
     * 调度配置,值含义取决于调度类型
     */
    private String scheduleConf;
    /**
     * 执行器,任务Handler名称
     */
    private String executorHandler;
    /**
     * 调度过期策略
     */
    private String misfireStrategy;
    /**
     * 执行器路由策略
     */
    private String executorRouteStrategy;
    /**
     * 执行器,任务参数
     */
    private String executorParam;
    /**
     * 阻塞处理策略
     */
    private String executorBlockStrategy;

}

/**
 * Created by xuxueli on 16/9/30.
 */
@Data
public class XxlJobGroup {

    private int id;
    private String appname;
    private String title;
    private int addressType;        // 执行器地址类型:0=自动注册、1=手动录入
    private String addressList;     // 执行器地址列表,多地址逗号分隔(手动录入)
    private Date updateTime;

    // registry list
    private List<String> registryList;  // 执行器地址列表(系统注册)

    public List<String> getRegistryList() {
        if (addressList != null && addressList.trim().length() > 0) {
            registryList = new ArrayList<String>(Arrays.asList(addressList.split(",")));
        }
        return registryList;
    }
}

/**
 * xxl-job info
 *
 * @author xuxueli  2016-1-12 18:25:49
 */
@Data
public class XxlJobInfo {
	
	private int id;				// 主键ID
	
	private int jobGroup;		// 执行器主键ID
	private String jobDesc;
	
	private Date addTime;
	private Date updateTime;
	
	private String author;		// 负责人
	private String alarmEmail;	// 报警邮件

	private String scheduleType;			// 调度类型
	private String scheduleConf;			// 调度配置,值含义取决于调度类型
	private String misfireStrategy;			// 调度过期策略

	private String executorRouteStrategy;	// 执行器路由策略
	private String executorHandler;		    // 执行器,任务Handler名称
	private String executorParam;		    // 执行器,任务参数
	private String executorBlockStrategy;	// 阻塞处理策略
	private int executorTimeout;     		// 任务执行超时时间,单位秒
	private int executorFailRetryCount;		// 失败重试次数
	
	private String glueType;		// GLUE类型	#com.xxl.job.core.glue.GlueTypeEnum
	private String glueSource;		// GLUE源代码
	private String glueRemark;		// GLUE备注
	private Date glueUpdatetime;	// GLUE更新时间

	private String childJobId;		// 子任务ID,多个逗号分隔

	private int triggerStatus;		// 调度状态:0-停止,1-运行
	private long triggerLastTime;	// 上次调度时间
	private long triggerNextTime;	// 下次调度时间
}

枚举

@AllArgsConstructor
@Getter
public enum XxlJobPathEnum {
    LOGIN("/login", "登录"),
    ADD("/jobinfo/add", "添加Job"),
    UPDATE("/jobinfo/update", "更新Job"),
    REMOVE("/jobinfo/remove", "删除Job"),
    PAGE_JOB("/jobinfo/pageList", "查询Job"),
    PAGE_GROUP("/jobgroup/pageList", "查询Job组");

    private String path;
    private String desc;
}

四、工具类


import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpStatus;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.xxl.job.admin.dto.AddXxlJob;
import com.xxl.job.admin.dto.UpdateXxlJob;
import com.xxl.job.admin.dto.XxlJobGroup;
import com.xxl.job.admin.dto.XxlJobInfo;
import com.xxl.job.admin.enums.XxlJobPathEnum;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.net.HttpCookie;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Component
public class XxlJobTemplate {
    @Value("${xxl.job.admin.addresses}")
    private String addresses;

    @Value("${xxl.job.admin.username}")
    private String username;

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

    private String cookie;

    /**
     * 查询执行器
     *
     * @param appname
     * @param title
     * @return
     */
    public List<XxlJobGroup> listGroup(String appname, String title) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("appname", appname);
        paramMap.put("title", title);

        JSONObject pageGroup = doRequest(XxlJobPathEnum.PAGE_GROUP, paramMap);

        List<XxlJobGroup> jobGroupList = JSONUtil.toList(pageGroup.getJSONArray("data"), XxlJobGroup.class);
        return jobGroupList;
    }

    /**
     * 查询job列表
     *
     * @param jobGroup        -1
     * @param triggerStatus   -1
     * @param jobDesc
     * @param executorHandler
     * @param author
     * @return
     */
    public List<XxlJobInfo> listJob(int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("jobGroup", jobGroup);
        paramMap.put("triggerStatus", triggerStatus);
        paramMap.put("jobDesc", jobDesc);
        paramMap.put("executorHandler", executorHandler);
        paramMap.put("author", author);

        JSONObject pageJob = doRequest(XxlJobPathEnum.PAGE_JOB, paramMap);

        List<XxlJobInfo> jobList = JSONUtil.toList(pageJob.getJSONArray("data"), XxlJobInfo.class);
        return jobList;
    }

    /**
     * 条件查询一个Job
     *
     * @param jobGroup        -1
     * @param triggerStatus   -1
     * @param jobDesc
     * @param executorHandler
     * @param author
     * @return
     */
    public XxlJobInfo getOneJob(int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) {
        List<XxlJobInfo> xxlJobInfos = listJob(jobGroup, triggerStatus, jobDesc, executorHandler, author);

        if (xxlJobInfos.size() > 1) {
            throw new RuntimeException(String.format("xxl-job-admin任务查询结果不唯一:%s", xxlJobInfos.toString()));
        }

        return xxlJobInfos.isEmpty() ? null : xxlJobInfos.get(0);
    }

    /**
     * 添加job
     *
     * @param addJob
     * @return
     */
    public Integer addJob(AddXxlJob addJob) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("jobGroup", addJob.getJobGroup());
        paramMap.put("jobDesc", addJob.getJobDesc());
        paramMap.put("author", addJob.getAuthor());
        paramMap.put("scheduleType", addJob.getScheduleType());
        paramMap.put("scheduleConf", addJob.getScheduleConf());
        paramMap.put("misfireStrategy", "DO_NOTHING");
        paramMap.put("executorRouteStrategy", "FIRST");
        paramMap.put("executorHandler", addJob.getExecutorHandler());
        //paramMap.put("executorParam", "");
        paramMap.put("executorBlockStrategy", "SERIAL_EXECUTION");

        paramMap.put("executorTimeout", 0);
        paramMap.put("executorFailRetryCount", 0);
        paramMap.put("glueType", "BEAN");
        paramMap.put("glueSource", "");
        paramMap.put("glueRemark", "GLUE代码初始化");
        paramMap.put("glueUpdatetime", null);
        paramMap.put("childJobId", "");
        paramMap.put("triggerStatus", 0);
        paramMap.put("triggerLastTime", 0);
        paramMap.put("triggerNextTime", 0);

        JSONObject result = doRequest(XxlJobPathEnum.ADD, paramMap);

        return result.getInt("content");
    }

    /**
     * 更新job
     *
     * @param updateXxlJob
     */
    public void updateJob(UpdateXxlJob updateXxlJob) {
        updateJob(JSONUtil.parseObj(updateXxlJob));
    }

    private void updateJob(Map<String, Object> paramMap) {
        JSONObject result = doRequest(XxlJobPathEnum.UPDATE, paramMap);

        if (HttpStatus.HTTP_OK != result.getInt("code")) {
            throw new RuntimeException(String.format("xxl-job-admin更新Job失败:%s", result.getStr("msg")));
        }
    }

    /**
     * 删除job
     *
     * @param jobId
     */
    public void removeJob(int jobId) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("id", jobId);

        doRequest(XxlJobPathEnum.REMOVE, paramMap);
    }

    /**
     * 获取登录cookie
     *
     * @return
     */
    private String getCookie() {
        Map<String, Object> paramsMap = new HashMap();
        paramsMap.put("userName", username);
        paramsMap.put("password", password);
        HttpResponse response = HttpRequest.post(String.format("%s%s", addresses, XxlJobPathEnum.LOGIN.getPath()))
                .form(paramsMap).execute();
        if (HttpStatus.HTTP_OK != response.getStatus()) {
            throw new RuntimeException(String.format("xxl-job-admin登录失败:statusCode=%s", response.getStatus()));
        }

        List<HttpCookie> cookies = response.getCookies();

        if (cookies.isEmpty()) {
            throw new RuntimeException(String.format("xxl-job-admin登录失败:[userName=%s,password=%s]", username, password));
        }

        return cookies.stream().map(cookie -> cookie.toString()).collect(Collectors.joining());
    }

    /**
     * 远程调用xxl-job-admin
     *
     * @param xxlJobPathEnum
     * @param paramMap
     * @return
     */
    private JSONObject doRequest(XxlJobPathEnum xxlJobPathEnum, Map<String, Object> paramMap) {
        if (StrUtil.isBlank(cookie)) {
            cookie = getCookie();
        }

        HttpResponse response = HttpRequest.post(String.format("%s%s", addresses, xxlJobPathEnum.getPath()))
                .cookie(cookie).form(paramMap).execute();
        if (HttpStatus.HTTP_OK != response.getStatus()) {
            throw new RuntimeException(String.format("xxl-job-admin%s请求失败:statusCode=%s",
                    xxlJobPathEnum.getDesc(), response.getStatus()));
        }

        JSONObject result = JSONUtil.parseObj(response.body());

        Integer code = result.getInt("code");
        if (code != null && HttpStatus.HTTP_OK != code) {
            throw new RuntimeException(String.format("xxl-job-admin%s失败:msg=%s", xxlJobPathEnum.getDesc(), result.getStr("msg")));
        }

        return result;
    }

}

五、测试类


import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import com.xxl.job.admin.dto.AddXxlJob;
import com.xxl.job.admin.dto.UpdateXxlJob;
import com.xxl.job.admin.dto.XxlJobGroup;
import com.xxl.job.admin.dto.XxlJobInfo;
import com.xxl.job.admin.template.XxlJobTemplate;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
public class TestXxlJobTemplate {

    @Autowired
    private XxlJobTemplate xxlJobTemplate;

    @Test
    public void pageGroupTest() {
        String appname = "";
        String title = "";
        List<XxlJobGroup> xxlJobGroups = xxlJobTemplate.listGroup(appname, title);
        System.out.println(xxlJobGroups);
    }

    @Test
    public void pageJobTest() {
        int jobGroup = 2;
        int triggerStatus = -1;
        String jobDesc = "";
        String executorHandler = "";
        String author = "";
        List<XxlJobInfo> xxlJobInfos = xxlJobTemplate.listJob(jobGroup, triggerStatus, jobDesc, executorHandler, author);
        System.out.println(xxlJobInfos);
    }

    @Test
    public void addJobTest() {
        AddXxlJob addXxlJob = new AddXxlJob()
                .setJobGroup(2)
                .setJobDesc("测试任务2")
                .setAuthor("dunyage")
                .setScheduleType("CRON")
                .setScheduleConf("0/8 * * * * ?")
                .setExecutorHandler("demo1JobHandler");
        Integer jobId = xxlJobTemplate.addJob(addXxlJob);
        System.out.println("添加成功");
        System.out.println(jobId);
    }

    @Test
    public void removeJobTest() {
        xxlJobTemplate.removeJob(3);
        System.out.println("删除成功");
    }

    @Test
    public void updatejobTest() {
        String beanName = "demo1JobHandler";
        XxlJobInfo xxlJobInfo = xxlJobTemplate.getOneJob(-1, -1, "", beanName, "");

        Assert.notNull(xxlJobInfo, String.format("更新job失败:job[executorHandler=%s]不存在", beanName));

        String param = xxlJobInfo.getExecutorParam();

        UpdateXxlJob updateXxlJob = new UpdateXxlJob();
        BeanUtil.copyProperties(xxlJobInfo, updateXxlJob);

        //修改
        updateXxlJob.setScheduleType("CRON");
        updateXxlJob.setScheduleConf("0/8 * * * * ?");
        updateXxlJob.setExecutorParam("job参数");

        xxlJobTemplate.updateJob(updateXxlJob);
        System.out.println("更新成功");
    }
}

  • 12
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
您好!对于调用 `xxljob` 的 RESTful 接口,您可以按照以下步骤进行操作: 1. 首先,需要确保 `xxljob` 已经正确安装和配置,并且服务已经启动运行。 2. 查询 `xxljob` 的接口文档,了解可用的接口和参数信息。一般而言,`xxljob` 提供了一系列用于任务管理和执行的接口。 3. 使用您喜欢的编程语言或框架,发起 HTTP 请求来调用 `xxljob` 的接口。这可以通过使用标准库提供的方法、第三方库或工具来实现。 例如,使用 Python 中的 `requests` 库可以发送 HTTP 请求,示例代码如下: ```python import requests url = "http://localhost:8080/xxl-job-admin/jobinfo/add" headers = { "Content-Type": "application/json" } data = { "jobGroup": 1, "executorRouteStrategy": "FIRST", "executorHandler": "demoJobHandler", "executorBlockStrategy": "SERIAL_EXECUTION", "jobDesc": "示例任务", "author": "C知道", "glueType": "BEAN", "glueRemark": "", "executorParam": "", "misfireStrategy": "DO_NOTHING", "cronGen_display": "0/5 * * * * ?", "childJobId": "", "executorTimeout": 0, "executorFailRetryCount": 0 } response = requests.post(url, json=data, headers=headers) if response.status_code == 200: print("调用成功") else: print("调用失败") ``` 注意,上述示例中的 URL、请求头、请求体数据和接口路径需要根据实际情况进行修改。 4. 根据响应结果进行相应的处理。正常情况下,`xxljob` 的接口会返回相应的执行结果或状态信息。 请确保在调用 `xxljob` 接口时,提供正确的参数和数据,并根据接口文档中的要求进行调用。希望对您有所帮助!如果有更多问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值