xxl-job-rest

This commit is contained in:
王永亮
2022-04-28 18:56:17 +08:00
parent b82f9c8e26
commit fa85a8b282
13 changed files with 645 additions and 163 deletions
+6 -6
View File
@@ -36,12 +36,12 @@
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
<scope>compile</scope>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.alibaba</groupId>-->
<!-- <artifactId>fastjson</artifactId>-->
<!-- <version>1.2.78</version>-->
<!-- <scope>compile</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
@@ -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 {
}
@@ -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);
}
}
@@ -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);
}
}
@@ -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模式)
* <p>
* 开发步骤:
* 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
}
}
@@ -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、引入依赖:
* <dependency>
* <groupId>org.springframework.cloud</groupId>
* <artifactId>spring-cloud-commons</artifactId>
* <version>${version}</version>
* </dependency>
*
* 2、配置文件,或者容器启动变量
* spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
*
* 3、获取IP
* String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
*/
}
@@ -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<String, String> makeParam() {
MultiValueMap<String, String> 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;
}
}
@@ -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<String, String> makeParam() {
MultiValueMap<String, String> hashMap = new LinkedMultiValueMap<>();
hashMap.add("id", id.toString());
hashMap.add("executorParam", executorParam);
hashMap.add("addressList", addressList);
return hashMap;
}
}
@@ -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<String, String> makeParam() {
MultiValueMap<String, String> hashMap = new LinkedMultiValueMap<>();
hashMap.add("userName", userName);
hashMap.add("password", password);
return hashMap;
}
}
@@ -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<T> {
/**
* 操作吗
*/
private Integer code;
/**
* 错误信息
*/
private String msg;
/**
* 结果信息
*/
private T content;
/**
* 操作成功
*/
public Boolean succeed() {
return 200 == code;
}
}
@@ -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<String, String> 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<String, String> creatJonParam = jobEntity.makeParam();
ResponseEntity<Result> 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<String, String> creatJonParam = jobEntity.makeParam();
ResponseEntity<Result> 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<String, String> jobTriggerParam = jobTriggerEntity.makeParam();
ResponseEntity<Result> 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<String, String> 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<Result> 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<String, String> paramMap = new LinkedMultiValueMap<>();
paramMap.add("id", String.valueOf(jobId));
ResponseEntity<Result> 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<String, String> 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<Result> 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<java.lang.String>
* @Date 2022/4/27
* @Author wangyl
*/
public String getCookie() {
String path = jobServerConfig.getAdminAddresses() + "/login";
public List<String> getCookie() {
LoginEntity loginEntity = new LoginEntity();
loginEntity.setUserName(jobServerConfig.getUserName());
loginEntity.setPassword(jobServerConfig.getPassword());
MultiValueMap<String, String> loginParam = loginEntity.makeParam();
ResponseEntity<Result> 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<String> 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<Result> postFrom(String url, MultiValueMap<String, String> hashMap, Boolean needCookies) {
HttpHeaders headers = new HttpHeaders();
List<String> 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<String, String> hashMap = new LinkedMultiValueMap<>();
// 组装请求体
hashMap.add("userName", jobServerConfig.getUserName());
hashMap.add("password", jobServerConfig.getPassword());
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(hashMap, headers);
ResponseEntity<String> stringResponseEntity = restTemplate.postForEntity(path, request, String.class);
return stringResponseEntity.toString();
//
// List<HttpCookie> cookies = response.getCookies();
// StringBuilder sb = new StringBuilder();
// for (HttpCookie cookie : cookies) {
// sb.append(cookie.toString());
// }
// return sb.toString();
}
public String post(String url, MultiValueMap<String, String> hashMap) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(hashMap, headers);
ResponseEntity<String> stringResponseEntity = restTemplate.postForEntity(url, request, String.class);
return stringResponseEntity.getBody();
ResponseEntity<Result> 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;
}
}
@@ -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
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
@@ -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<String> 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);
}
}