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);
}
}