From fa85a8b2820a1b12058d001375db2ed8e125dbd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=B0=B8=E4=BA=AE?= Date: Thu, 28 Apr 2022 18:56:17 +0800 Subject: [PATCH] xxl-job-rest --- spring-boot/spring-boot-xxjob/pom.xml | 12 +- .../wyl/springbootxxjob/EnableXxljobRest.java | 13 + .../config/JobServerConfig.java | 56 ++-- .../config/RestTemplateConfig.java | 34 --- .../wyl/springbootxxjob/job/SampleXxlJob.java | 50 ++++ .../wyl/springbootxxjob/job/XxlJobConfig.java | 77 +++++ .../wyl/springbootxxjob/obj/JobEntity.java | 107 +++++++ .../springbootxxjob/obj/JobTriggerEntity.java | 34 +++ .../wyl/springbootxxjob/obj/LoginEntity.java | 29 ++ .../com/wyl/springbootxxjob/obj/Result.java | 31 ++ .../service/DynamicXxlJobService.java | 268 ++++++++++++------ .../src/main/resources/application.properties | 23 +- .../SpringBootXxjobApplicationTests.java | 74 ++++- 13 files changed, 645 insertions(+), 163 deletions(-) create mode 100644 spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/EnableXxljobRest.java delete mode 100644 spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/config/RestTemplateConfig.java create mode 100644 spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/job/SampleXxlJob.java create mode 100644 spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/job/XxlJobConfig.java create mode 100644 spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/obj/JobEntity.java create mode 100644 spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/obj/JobTriggerEntity.java create mode 100644 spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/obj/LoginEntity.java create mode 100644 spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/obj/Result.java diff --git a/spring-boot/spring-boot-xxjob/pom.xml b/spring-boot/spring-boot-xxjob/pom.xml index 63d7da1..ab73768 100644 --- a/spring-boot/spring-boot-xxjob/pom.xml +++ b/spring-boot/spring-boot-xxjob/pom.xml @@ -36,12 +36,12 @@ spring-boot-starter-test test - - com.alibaba - fastjson - 1.2.78 - compile - + + + + + + com.squareup.okhttp3 okhttp diff --git a/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/EnableXxljobRest.java b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/EnableXxljobRest.java new file mode 100644 index 0000000..61fec7b --- /dev/null +++ b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/EnableXxljobRest.java @@ -0,0 +1,13 @@ +package com.wyl.springbootxxjob; + +import com.wyl.springbootxxjob.config.JobServerConfig; +import org.springframework.context.annotation.Import; + +import java.lang.annotation.*; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Import(JobServerConfig.class) +public @interface EnableXxljobRest { +} diff --git a/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/config/JobServerConfig.java b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/config/JobServerConfig.java index 8809915..9d5fa8d 100644 --- a/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/config/JobServerConfig.java +++ b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/config/JobServerConfig.java @@ -1,46 +1,54 @@ package com.wyl.springbootxxjob.config; -import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import com.wyl.springbootxxjob.service.DynamicXxlJobService; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import okhttp3.OkHttpClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.OkHttp3ClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +import java.util.concurrent.TimeUnit; + -@Slf4j @Configuration @Getter +@Slf4j public class JobServerConfig { - @Value("${job.server.admin.addresses}") + @Value("${xxl-job.http.serve.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}") + @Value("${xxl-job.http.job.server.userName}") private String userName; - @Value("${job.server.password}") + @Value("${xxl-job.http.job.server.password}") private String password; - @Value("${job.server.jobGroup}") - private String jobGroup; + @Bean("xxJobRestTemplate") + public RestTemplate restTemplate() { + RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory()); + return restTemplate; + } @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; + DynamicXxlJobService dynamicXxlJobService() { + return new DynamicXxlJobService(); + } + + /** + * 使用OkHttpClient作为底层客户端 + * + * @return + */ + private ClientHttpRequestFactory getClientHttpRequestFactory() { + OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS) + .writeTimeout(5, TimeUnit.SECONDS) + .readTimeout(5, TimeUnit.SECONDS) + .build(); + return new OkHttp3ClientHttpRequestFactory(okHttpClient); } } diff --git a/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/config/RestTemplateConfig.java b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/config/RestTemplateConfig.java deleted file mode 100644 index 1c9af2e..0000000 --- a/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/config/RestTemplateConfig.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.wyl.springbootxxjob.config; - -import okhttp3.OkHttpClient; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.client.ClientHttpRequestFactory; -import org.springframework.http.client.OkHttp3ClientHttpRequestFactory; -import org.springframework.web.client.RestTemplate; - -import java.util.concurrent.TimeUnit; - -@Configuration -public class RestTemplateConfig { - - @ConditionalOnMissingBean(RestTemplate.class) - @Bean - public RestTemplate restTemplate() { - RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory()); - return restTemplate; - } - - /** - * 使用OkHttpClient作为底层客户端 - * @return - */ - private ClientHttpRequestFactory getClientHttpRequestFactory() { - OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS) - .writeTimeout(5, TimeUnit.SECONDS) - .readTimeout(5, TimeUnit.SECONDS) - .build(); - return new OkHttp3ClientHttpRequestFactory(okHttpClient); - } -} \ No newline at end of file diff --git a/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/job/SampleXxlJob.java b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/job/SampleXxlJob.java new file mode 100644 index 0000000..585a4fe --- /dev/null +++ b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/job/SampleXxlJob.java @@ -0,0 +1,50 @@ +package com.wyl.springbootxxjob.job; + +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.sound.midi.Soundbank; +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +/** + * XxlJob开发示例(Bean模式) + *

+ * 开发步骤: + * 1、任务开发:在Spring Bean实例中,开发Job方法; + * 2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。 + * 3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志; + * 4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果; + * + * @author xuxueli 2019-12-11 21:52:51 + */ +@Component +public class SampleXxlJob { + private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class); + + + /** + * 1、简单任务示例(Bean模式) + */ + @XxlJob("wylDemoHandler") + public void demoJobHandler() throws Exception { + XxlJobHelper.log("XXL-JOB, Hello World."); + System.out.println(XxlJobHelper.getJobParam()); + System.out.println(XxlJobHelper.getJobId()); + for (int i = 0; i < 5; i++) { + XxlJobHelper.log("beat at:" + i); + TimeUnit.SECONDS.sleep(2); + } + // default success + } + +} diff --git a/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/job/XxlJobConfig.java b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/job/XxlJobConfig.java new file mode 100644 index 0000000..9214baa --- /dev/null +++ b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/job/XxlJobConfig.java @@ -0,0 +1,77 @@ +package com.wyl.springbootxxjob.job; + +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * xxl-job config + * + * @author xuxueli 2017-04-28 + */ +@Configuration +public class XxlJobConfig { + private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); + + @Value("${xxl.job.admin.addresses}") + private String adminAddresses; + + @Value("${xxl.job.accessToken}") + private String accessToken; + + @Value("${xxl.job.executor.appname}") + private String appname; + + @Value("${xxl.job.executor.address}") + private String address; + + @Value("${xxl.job.executor.ip}") + private String ip; + + @Value("${xxl.job.executor.port}") + private int port; + + @Value("${xxl.job.executor.logpath}") + private String logPath; + + @Value("${xxl.job.executor.logretentiondays}") + private int logRetentionDays; + + + @Bean + public XxlJobSpringExecutor xxlJobExecutor() { + logger.info(">>>>>>>>>>> xxl-job config init."); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppname(appname); + xxlJobSpringExecutor.setAddress(address); + xxlJobSpringExecutor.setIp(ip); + xxlJobSpringExecutor.setPort(port); + xxlJobSpringExecutor.setAccessToken(accessToken); + xxlJobSpringExecutor.setLogPath(logPath); + xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); + return xxlJobSpringExecutor; + } + + /** + * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP; + * + * 1、引入依赖: + * + * org.springframework.cloud + * spring-cloud-commons + * ${version} + * + * + * 2、配置文件,或者容器启动变量 + * spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.' + * + * 3、获取IP + * String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress(); + */ + + +} \ No newline at end of file diff --git a/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/obj/JobEntity.java b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/obj/JobEntity.java new file mode 100644 index 0000000..c52f7f8 --- /dev/null +++ b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/obj/JobEntity.java @@ -0,0 +1,107 @@ +package com.wyl.springbootxxjob.obj; + +import lombok.Data; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +/** + * @author: wangyl + * @date: 2022/4/27 + * @description: 创建任务对象 + */ +@Data +public class JobEntity { + /** + * 任务id 修改是需要填写 + */ + Integer id; + /** + * 执行器主键ID + */ + String jobGroup = ""; + /** + * job描述 + */ + String jobDesc = ""; + /** + * 作者 + */ + String author = "xxl-job-rest"; + /** + * 调度类型 + */ + String scheduleType = "CRON"; + /** + * 调度配置,值含义取决于调度类型 + */ + String scheduleConf = ""; + /** + * 调度过期策略 + */ + String cronGenDisplay = ""; + /** + * + */ + String scheduleConfCRON = ""; + /** + * GLUE类型 #com.xxl.job.core.glue.GlueTypeEnum + */ + String glueType = "BEAN"; + /** + * 执行器,任务Handler名称 + */ + String executorHandler = ""; + /** + * 执行器,任务参数 + */ + String executorParam = ""; + /** + * 执行器路由策略 + */ + String executorRouteStrategy = "FIRST"; + /** + * 调度过期策略 + */ + String misfireStrategy = "DO_NOTHING"; + /** + * 阻塞处理策略 + */ + String executorBlockStrategy = "SERIAL_EXECUTION"; + /** + * 任务执行超时时间,单位秒 + */ + String executorTimeout = "0"; + /** + * 失败重试次数 + */ + String executorFailRetryCount = "0"; + /** + * GLUE备注 + */ + String glueRemark = ""; + + public MultiValueMap makeParam() { + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + paramMap.add("jobGroup", jobGroup); + paramMap.add("jobDesc", jobDesc); + paramMap.add("author", author); + paramMap.add("scheduleType", scheduleType); + paramMap.add("scheduleConf", scheduleConf); + paramMap.add("cronGen_display", cronGenDisplay); + paramMap.add("glueType", glueType); + paramMap.add("executorHandler", executorHandler); + paramMap.add("executorParam", executorParam); + paramMap.add("executorRouteStrategy", executorRouteStrategy); + paramMap.add("misfireStrategy", misfireStrategy); + paramMap.add("executorBlockStrategy", executorBlockStrategy); + paramMap.add("executorTimeout", executorTimeout); + paramMap.add("executorFailRetryCount", executorFailRetryCount); + paramMap.add("glueRemark", glueRemark); + paramMap.add("schedule_conf_CRON", scheduleConfCRON); + if (id != null) { + paramMap.add("id", id.toString()); + } + return paramMap; + } + +} diff --git a/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/obj/JobTriggerEntity.java b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/obj/JobTriggerEntity.java new file mode 100644 index 0000000..8d76ec6 --- /dev/null +++ b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/obj/JobTriggerEntity.java @@ -0,0 +1,34 @@ +package com.wyl.springbootxxjob.obj; + +import lombok.Data; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +/** + * @author: wangyl + * @date: 2022/4/27 + * @description: 立即执行任务参数 + */ +@Data +public class JobTriggerEntity { + /** + * 任务id + */ + Integer id; + /** + * 执行参数 + */ + String executorParam; + /** + * 执行任务机器ip列表 + */ + String addressList; + + public MultiValueMap makeParam() { + MultiValueMap hashMap = new LinkedMultiValueMap<>(); + hashMap.add("id", id.toString()); + hashMap.add("executorParam", executorParam); + hashMap.add("addressList", addressList); + return hashMap; + } +} diff --git a/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/obj/LoginEntity.java b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/obj/LoginEntity.java new file mode 100644 index 0000000..163fc9a --- /dev/null +++ b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/obj/LoginEntity.java @@ -0,0 +1,29 @@ +package com.wyl.springbootxxjob.obj; + +import lombok.Data; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +/** + * @author: wangyl + * @date: 2022/4/27 + * @description: xx-job 登录对象 + */ +@Data +public class LoginEntity { + /** + * 用户名 + */ + String userName = ""; + /** + * 密码 + */ + String password = ""; + + public MultiValueMap makeParam() { + MultiValueMap hashMap = new LinkedMultiValueMap<>(); + hashMap.add("userName", userName); + hashMap.add("password", password); + return hashMap; + } +} diff --git a/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/obj/Result.java b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/obj/Result.java new file mode 100644 index 0000000..f767e87 --- /dev/null +++ b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/obj/Result.java @@ -0,0 +1,31 @@ +package com.wyl.springbootxxjob.obj; + +import lombok.Data; + +/** + * @author: wangyl + * @date: 2022/4/27 + * @description: xx-job请求返回对象 + */ +@Data +public class Result { + /** + * 操作吗 + */ + private Integer code; + /** + * 错误信息 + */ + private String msg; + /** + * 结果信息 + */ + private T content; + + /** + * 操作成功 + */ + public Boolean succeed() { + return 200 == code; + } +} diff --git a/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/service/DynamicXxlJobService.java b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/service/DynamicXxlJobService.java index 31fd7ff..1eb7de2 100644 --- a/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/service/DynamicXxlJobService.java +++ b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/service/DynamicXxlJobService.java @@ -1,139 +1,231 @@ package com.wyl.springbootxxjob.service; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.wyl.springbootxxjob.config.JobServerConfig; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; +import com.wyl.springbootxxjob.obj.JobEntity; +import com.wyl.springbootxxjob.obj.JobTriggerEntity; +import com.wyl.springbootxxjob.obj.LoginEntity; +import com.wyl.springbootxxjob.obj.Result; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.*; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; + +import javax.annotation.PostConstruct; import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; @Service +@Slf4j public class DynamicXxlJobService { + /** + * 登录url + */ + static private String LOGIN_URL; + /** + * 创建任务的url + */ + static private String CREATE_JOB; + + /** + * 创建任务的url + */ + static private String UPDATE_JOB; + /** + * 删除任务的url + */ + static private String REMOVE_JOB; + /** + * 启动任务的url + */ + static private String START_JOB; + /** + * 停止任务的url + */ + static private String STOP_JOB; + /** + * 立即执行任务url + */ + static private String TRIGGER_JOB; + + @PostConstruct + public void init() { + LOGIN_URL = jobServerConfig.getAdminAddresses() + "/login"; + CREATE_JOB = jobServerConfig.getAdminAddresses() + "/jobinfo/add"; + UPDATE_JOB = jobServerConfig.getAdminAddresses() + "/jobinfo/update"; + REMOVE_JOB = jobServerConfig.getAdminAddresses() + "/jobinfo/remove"; + START_JOB = jobServerConfig.getAdminAddresses() + "/jobinfo/start"; + STOP_JOB = jobServerConfig.getAdminAddresses() + "/jobinfo/stop"; + TRIGGER_JOB = jobServerConfig.getAdminAddresses() + "/jobinfo/trigger"; + } + @Resource private JobServerConfig jobServerConfig; - @Autowired + @Resource(name = "xxJobRestTemplate") RestTemplate restTemplate; /** - * 创建固定任务 + * 创建定时任务 * - * @param desc 任务描述 - * @param corn cron 表达式 - * @param param param - * @return jobId + * @param jobEntity + * @return java.lang.Integer + * @Date 2022/4/27 + * @Author wangyl */ - private int createJob(String cookie, String desc, String corn, String param) { - - int jobId = -1; - MultiValueMap paramMap = new LinkedMultiValueMap<>(); - paramMap.add("jobGroup", jobServerConfig.getJobGroup()); - paramMap.add("jobDesc", desc); - paramMap.add("author", "system_patrol"); - paramMap.add("scheduleType", "CRON"); - paramMap.add("scheduleConf", corn); - paramMap.add("cronGen_display", corn); - paramMap.add("glueType", "BEAN"); - paramMap.add("executorHandler", "patrolGenerateHandler"); - paramMap.add("executorParam", param); - paramMap.add("executorRouteStrategy", "FIRST"); - paramMap.add("misfireStrategy", "DO_NOTHING"); - paramMap.add("executorBlockStrategy", "SERIAL_EXECUTION"); - paramMap.add("executorTimeout", "0"); - paramMap.add("executorFailRetryCount", "0"); - paramMap.add("glueRemark", "GLUE代码初始化"); - paramMap.add("cookie", cookie); - String s = post("", paramMap); - JSONObject jsonObject = JSON.parseObject(s); - int code = jsonObject.getIntValue("code"); - if (code == 200) { - jobId = jsonObject.getIntValue("content"); + public Integer createJob(JobEntity jobEntity) { + MultiValueMap creatJonParam = jobEntity.makeParam(); + ResponseEntity responseEntity = this.postFrom(CREATE_JOB, creatJonParam, true); + Result body = responseEntity.getBody(); + if (!body.succeed()) { + log.error("创建任务失败,参数为;" + creatJonParam + "错误为:" + body.getMsg()); + throw new RuntimeException(); } - - return jobId; + Object jobId = body.getContent(); + return Integer.valueOf(jobId.toString()); } + /** + * 更新定时任务信息 + * @param jobEntity + * @return boolean + * @Date 2022/4/28 + * @Author wangyl + */ + public boolean updateJob(JobEntity jobEntity) { + MultiValueMap creatJonParam = jobEntity.makeParam(); + ResponseEntity responseEntity = this.postFrom(UPDATE_JOB, creatJonParam, true); + Result body = responseEntity.getBody(); + if (!body.succeed()) { + log.error("更新任务失败,参数为;" + creatJonParam + "错误为:" + body.getMsg()); + throw new RuntimeException(body.getMsg()); + } + return true; + } + public boolean triggerJob(JobTriggerEntity jobTriggerEntity) { + MultiValueMap jobTriggerParam = jobTriggerEntity.makeParam(); + ResponseEntity responseEntity = this.postFrom(TRIGGER_JOB, jobTriggerParam, true); + Result body = responseEntity.getBody(); + if (!body.succeed()) { + log.error("立即执行任务失败,参数为;" + jobTriggerEntity + "错误为:" + body.getMsg()); + throw new RuntimeException(); + } + return true; + } /** * 启动固定任务 - * @param cookie cookie + * * @param jobId jobId * @return 启动固定任务 */ - private boolean start(String cookie, int jobId) { + public boolean startJob(Integer jobId) { MultiValueMap paramMap = new LinkedMultiValueMap<>(); paramMap.add("id", String.valueOf(jobId)); - paramMap.add("cookie", "cookie"); - String s = post("", paramMap); - JSONObject jsonObject = JSON.parseObject(s); - int code = jsonObject.getIntValue("code"); - if (code == 200) { - return true; + ResponseEntity responseEntity = postFrom(START_JOB, paramMap, true); + Result body = responseEntity.getBody(); + if (!body.succeed()) { + log.error("job:" + jobId + "启动失败,失败理由:" + body.getMsg()); + throw new RuntimeException(body.getMsg());//todo 替换异常对象 } - return false; + + return true; + } + + /** + * 停止任务 + * + * @param jobId + * @return boolean + * @Date 2022/4/27 + * @Author wangyl + */ + public boolean stopJob(Integer jobId) { + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + paramMap.add("id", String.valueOf(jobId)); + ResponseEntity responseEntity = postFrom(STOP_JOB, paramMap, true); + Result body = responseEntity.getBody(); + if (!body.succeed()) { + log.error("job:" + jobId + "停止失败,失败理由:" + body.getMsg()); + throw new RuntimeException(body.getMsg());//todo 替换异常对象 + } + + return true; } /** - * 删除固定任务 - * @param cookie cookie - * @param jobId jobId - * @return 启动固定任务 + * 删除指定任务 + * + * @param jobId 任务id + * @return boolean + * @Date 2022/4/27 + * @Author wangyl */ - public boolean remove(String cookie, int jobId) { + public boolean removeJob(Integer jobId) { MultiValueMap paramMap = new LinkedMultiValueMap<>(); paramMap.add("id", String.valueOf(jobId)); - String s = post("", paramMap); - JSONObject jsonObject = JSON.parseObject(s); - int code = jsonObject.getInteger("code"); - if (code == 200) { - return true; + ResponseEntity responseEntity = postFrom(REMOVE_JOB, paramMap, true); + Result body = responseEntity.getBody(); + if (!body.succeed()) { + log.error("job:" + jobId + "删除失败,失败理由:" + body.getMsg()); + throw new RuntimeException(body.getMsg());//todo 替换异常对象 } - return false; + return true; } /** - * 获取cookie - * @return 返回cookie值 + * 登录xx-job获取cookies + * + * @param + * @return java.util.List + * @Date 2022/4/27 + * @Author wangyl */ - public String getCookie() { - String path = jobServerConfig.getAdminAddresses() + "/login"; + public List getCookie() { + LoginEntity loginEntity = new LoginEntity(); + loginEntity.setUserName(jobServerConfig.getUserName()); + loginEntity.setPassword(jobServerConfig.getPassword()); + MultiValueMap loginParam = loginEntity.makeParam(); + ResponseEntity responseEntity = this.postFrom(LOGIN_URL, loginParam, false); + Result result = responseEntity.getBody(); + if (!result.succeed()) { + log.error("登录xx-job失败", result.getMsg()); + throw new RuntimeException(result.getMsg());//todo 替换异常对象 + } + List cookies = responseEntity.getHeaders().get("Set-Cookie"); + return cookies; + } + /** + * 发送post的 form 请求 + * + * @param url 请求url + * @param hashMap 请求参数 + * @return java.lang.String + * @Date 2022/4/27 + * @Author wangyl + */ + public ResponseEntity postFrom(String url, MultiValueMap hashMap, Boolean needCookies) { + HttpHeaders headers = new HttpHeaders(); + List cookies = new ArrayList<>(); + if (needCookies && CollectionUtils.isEmpty(cookies)) { + cookies = getCookie(); + headers.put(HttpHeaders.COOKIE, cookies); + } // 请求头设置,x-www-form-urlencoded格式的数据 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - - //提交参数设置 - MultiValueMap hashMap = new LinkedMultiValueMap<>(); - // 组装请求体 - hashMap.add("userName", jobServerConfig.getUserName()); - hashMap.add("password", jobServerConfig.getPassword()); - HttpEntity> request = new HttpEntity<>(hashMap, headers); - ResponseEntity stringResponseEntity = restTemplate.postForEntity(path, request, String.class); - return stringResponseEntity.toString(); -// -// List cookies = response.getCookies(); -// StringBuilder sb = new StringBuilder(); -// for (HttpCookie cookie : cookies) { -// sb.append(cookie.toString()); -// } -// return sb.toString(); - } - - public String post(String url, MultiValueMap hashMap) { - HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); HttpEntity> request = new HttpEntity<>(hashMap, headers); - ResponseEntity stringResponseEntity = restTemplate.postForEntity(url, request, String.class); - return stringResponseEntity.getBody(); + ResponseEntity responseEntity = restTemplate.postForEntity(url, request, Result.class); + if (!(responseEntity.getStatusCode() == HttpStatus.OK)) { + log.error("请求url:" + url + ",param:" + hashMap + " result:" + responseEntity); + throw new RuntimeException("");//TODO 修改为异常 + } + return responseEntity; } } diff --git a/spring-boot/spring-boot-xxjob/src/main/resources/application.properties b/spring-boot/spring-boot-xxjob/src/main/resources/application.properties index 951ef5b..900cff9 100644 --- a/spring-boot/spring-boot-xxjob/src/main/resources/application.properties +++ b/spring-boot/spring-boot-xxjob/src/main/resources/application.properties @@ -1,7 +1,16 @@ -job.server.admin.addresses=http://192.168.123.102:9090/xxl-job-admin -job.server.accessToken=1 -job.server.executor.appname= asd -job.server.executor.address= 192.168.123.148 -job.server.userName=admin -job.server.password=123456 -job.server.jobGroup=1 \ No newline at end of file +xxl-job.http.serve.admin.addresses=http://192.168.3.10:8080/xxl-job-admin/ +xxl-job.http.job.server.userName = admin +xxl-job.http.job.server.password = 123456 + + + + +### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" +xxl.job.admin.addresses=http://192.168.3.10:8080/xxl-job-admin +xxl.job.accessToken= +xxl.job.executor.appname=wyl-first-test +xxl.job.executor.address= +xxl.job.executor.ip= +xxl.job.executor.port=9999 +xxl.job.executor.logpath=./logs +xxl.job.executor.logretentiondays=30 diff --git a/spring-boot/spring-boot-xxjob/src/test/java/com/wyl/springbootxxjob/SpringBootXxjobApplicationTests.java b/spring-boot/spring-boot-xxjob/src/test/java/com/wyl/springbootxxjob/SpringBootXxjobApplicationTests.java index 39d99ae..f0376ac 100644 --- a/spring-boot/spring-boot-xxjob/src/test/java/com/wyl/springbootxxjob/SpringBootXxjobApplicationTests.java +++ b/spring-boot/spring-boot-xxjob/src/test/java/com/wyl/springbootxxjob/SpringBootXxjobApplicationTests.java @@ -1,17 +1,83 @@ package com.wyl.springbootxxjob; +import com.wyl.springbootxxjob.obj.JobEntity; +import com.wyl.springbootxxjob.obj.JobTriggerEntity; import com.wyl.springbootxxjob.service.DynamicXxlJobService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -class SpringBootXxjobApplicationTests extends BaseTest{ +import java.time.LocalDateTime; +import java.util.List; + +class SpringBootXxjobApplicationTests extends BaseTest { @Autowired DynamicXxlJobService dynamicXxlJobService; + @Test - void contextLoads() { - dynamicXxlJobService.getCookie(); + void getCookiesTest() { + List cookie = dynamicXxlJobService.getCookie(); + System.out.println(cookie); + } + + @Test + void createJobTest() { + JobEntity jobEntity = new JobEntity(); + jobEntity.setJobGroup("2"); + jobEntity.setJobDesc("测试项目"+ LocalDateTime.now()); + jobEntity.setAuthor("wyl"); + jobEntity.setScheduleConf("* * * * * ?"); + jobEntity.setCronGenDisplay("* * * * * ?"); + jobEntity.setGlueType("BEAN"); + jobEntity.setExecutorHandler("wylDemoHandler"); + jobEntity.setExecutorRouteStrategy("FIRST"); + jobEntity.setMisfireStrategy("DO_NOTHING"); + jobEntity.setExecutorTimeout("0"); + jobEntity.setExecutorFailRetryCount("0"); + jobEntity.setGlueRemark("wyl测试新建项目"); + Integer job = dynamicXxlJobService.createJob(jobEntity); + } + + @Test + void updateJobTest() { + JobEntity jobEntity = new JobEntity(); + jobEntity.setId(7); + jobEntity.setJobGroup("2"); + jobEntity.setJobDesc("测试项目"+ LocalDateTime.now()+"更新"); + jobEntity.setAuthor("wyl"); + jobEntity.setScheduleConf("* * * * * ?"); + jobEntity.setCronGenDisplay("* * * * * ?"); + jobEntity.setGlueType("BEAN"); + jobEntity.setExecutorHandler("wylDemoHandler"); + jobEntity.setExecutorRouteStrategy("FIRST"); + jobEntity.setMisfireStrategy("DO_NOTHING"); + jobEntity.setExecutorTimeout("0"); + jobEntity.setExecutorFailRetryCount("0"); + jobEntity.setGlueRemark("wyl测试新建项目"); + dynamicXxlJobService.updateJob(jobEntity); + } + + @Test + void triggerJobTest() { + JobTriggerEntity jobTriggerEntity = new JobTriggerEntity(); + jobTriggerEntity.setId(5); + jobTriggerEntity.setExecutorParam("123"); + dynamicXxlJobService.triggerJob(jobTriggerEntity); + } + + @Test + void startJobTest() { + boolean b = dynamicXxlJobService.startJob(3); + } + + @Test + void stopJobJobTest() { + boolean b = dynamicXxlJobService.stopJob(3); + } + + @Test + void removeJobTest() { + boolean b = dynamicXxlJobService.removeJob(1); } }