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(); } }
以上亲测成功,有问题欢迎指出,交流