配置文件
配置文件配置用户名密码
xxl.job.admin.addresses=http://xxx.xxx.xxx.xxx:xxxx/xxl-job-admin
xxl.job.executor.address=
xxl.job.executor.appname=rapid-job-handle
xxl.job.executor.ip=
xxl.job.executor.port=0
xxl.job.executor.logpath=/data/xxl-job-log/jobhandler
xxl.job.executor.logretentiondays=15
xxl.job.accessToken=
xxl.job.username=xxx
xxl.job.password=xxx
加载配置文件
@Slf4j
@Configuration
@Data
public class XxlJobConfig {
@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;
@Value("${xxl.job.username}")
private String username;
@Value("${xxl.job.password}")
private String password;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
log.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);
log.info("----- xxl-job config end -----");
return xxlJobSpringExecutor;
}
}
常量
public interface XxlJobConstant {
/**
* xxlJob路径相关
*/
//xxl_job登录路径
public static final String XXL_JOB_LOGIN_URL = "/login";
//xxl_job执行器列表路径
public static final String XXL_JOB_JOB_GROUP_LIST_URL = "/jobgroup/pageList";
//xxl_job执行器存储路径
public static final String XXL_JOB_CREATE_JOB_GROUP_URL = "/jobgroup/save";
//xxl_job任务列表路径
public static final String XXL_JOB_INFO_LIST_URL = "/jobinfo/pageList";
//xxl_job任务存储路径
public static final String XXL_JOB_ADD_JOB_INFO_URL = "/jobinfo/save";
//xxl_job任务开启路径
public static final String XXL_JOB_START_JOB_INFO_URL = "/jobinfo/start";
//xxl_job任务关闭路径
public static final String XXL_JOB_STOP_JOB_INFO_URL = "/jobinfo/stop";
//xxl_job任务删除路径
public static final String XXL_JOB_REMOVE_JOB_INFO_URL = "/jobinfo/remove";
//xxl_job任务修改路径
public static final String XXL_JOB_UPDATE_JOB_INFO_URL = "/jobinfo/update";
/**
* redis键名
*/
//cookie
public static final String XXL_JOB_REDIS_COOKIE_KEY_NAME = "xxlJob:cookie";
}
定时任务实体
/**
* xxl-job 定时任务实体
*/
@Data
public class XxlJobInfo {
private int id; // 主键ID
private int jobGroup; // 执行器主键ID
private String jobDesc;
private Date addTime;
private Date updateTime;
private String author; // 负责人
private String alarmEmail; // 报警邮件
private String scheduleType; // 调度类型
private String scheduleConf; // 调度配置,值含义取决于调度类型
private String misfireStrategy; // 调度过期策略
private String executorRouteStrategy; // 执行器路由策略
private String executorHandler; // 执行器,任务Handler名称
private String executorParam; // 执行器,任务参数
private String executorBlockStrategy; // 阻塞处理策略
private int executorTimeout; // 任务执行超时时间,单位秒
private int executorFailRetryCount; // 失败重试次数
private String glueType; // GLUE类型 #com.xxl.job.core.glue.GlueTypeEnum
private String glueSource; // GLUE源代码
private String glueRemark; // GLUE备注
private Date glueUpdatetime; // GLUE更新时间
private String childJobId; // 子任务ID,多个逗号分隔
private int triggerStatus; // 调度状态:0-停止,1-运行
private long triggerLastTime; // 上次调度时间
private long triggerNextTime; // 下次调度时间
}
执行器实体
/**
* xxl-job 执行器实体
*/
@Data
public class XxlJobGroup {
private int id;
private String appname;
private String title;
private int addressType; // 执行器地址类型:0=自动注册、1=手动录入
private String addressList; // 执行器地址列表,多地址逗号分隔(手动录入)
private Date updateTime;
// registry list
private List<String> registryList; // 执行器地址列表(系统注册)
public List<String> getRegistryList() {
if (addressList!=null && addressList.trim().length()>0) {
registryList = new ArrayList<String>(Arrays.asList(addressList.split(",")));
}
return registryList;
}
}
连接客户端
@Component
@Slf4j
public class XxlClient {
@Resource
private RedisUtils redisUtils;
@Resource
private XxlJobConfig xxlJobConfig;
/**
* 获取所有执行器
* @return jSONObject
*/
public JSONObject getAllGroup() {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("start", 0);
paramMap.put("length", 1000);
return this.sendForm(xxlJobConfig.getAdminAddresses() + XxlJobConstant.XXL_JOB_JOB_GROUP_LIST_URL, paramMap);
}
/**
* 创建执行器
* @param xxlJobGroup 执行器实体
* @return jSONObject
*/
public JSONObject createGroup(XxlJobGroup xxlJobGroup) {
Map paramMap= JSON.parseObject(JSON.toJSONString(xxlJobGroup),Map.class);
return this.sendForm(xxlJobConfig.getAdminAddresses() + XxlJobConstant.XXL_JOB_CREATE_JOB_GROUP_URL, paramMap);
}
/**
* 获取指定执行器下所有任务
* @param jobGroup 执行器id
* @return jSONObject
*/
public JSONObject getAllJobInfo(Integer jobGroup) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("start", 0);
paramMap.put("length", 1000);
paramMap.put("triggerStatus", -1);//-1等于全部类型
paramMap.put("jobGroup", jobGroup);
return this.sendForm(xxlJobConfig.getAdminAddresses() + XxlJobConstant.XXL_JOB_INFO_LIST_URL, paramMap);
}
/**
* 开启指定定时任务
* @param jobInfoId 任务id
* @return jSONObject
*/
public JSONObject startJobInfo(Integer jobInfoId) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id", jobInfoId);
return this.sendForm(xxlJobConfig.getAdminAddresses() + XxlJobConstant.XXL_JOB_START_JOB_INFO_URL, paramMap);
}
/**
* 关闭指定定时任务
* @param jobInfoId 任务id
* @return jSONObject
*/
public JSONObject stopJobInfo(Integer jobInfoId) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id", jobInfoId);
return this.sendForm(xxlJobConfig.getAdminAddresses() + XxlJobConstant.XXL_JOB_STOP_JOB_INFO_URL, paramMap);
}
/**
* 新建定时任务
* @param xxlJobInfo 任务类实体
* @return jSONObject
*/
public JSONObject createJobInfo(XxlJobInfo xxlJobInfo) {
Map paramMap= JSON.parseObject(JSON.toJSONString(xxlJobInfo),Map.class);
return this.sendForm(xxlJobConfig.getAdminAddresses() + XxlJobConstant.XXL_JOB_ADD_JOB_INFO_URL, paramMap);
}
/**
* 删除定时任务
* @param jobInfoId 任务id
* @return jSONObject
*/
public JSONObject removeJobInfo(Integer jobInfoId) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("jobInfoId", jobInfoId);
return this.sendForm(xxlJobConfig.getAdminAddresses() + XxlJobConstant.XXL_JOB_REMOVE_JOB_INFO_URL, paramMap);
}
/**
* 修改定时任务
* @param xxlJobInfo 任务类实体
* @return jSONObject
*/
public JSONObject updateJobInfo(XxlJobInfo xxlJobInfo) {
Map paramMap= JSON.parseObject(JSON.toJSONString(xxlJobInfo),Map.class);
return this.sendForm(xxlJobConfig.getAdminAddresses() + XxlJobConstant.XXL_JOB_UPDATE_JOB_INFO_URL, paramMap);
}
/**
* 获取cookie
* @return String
*/
public String getCookie() {
boolean flag = redisUtils.hasKey(XxlJobConstant.XXL_JOB_REDIS_COOKIE_KEY_NAME);
if (flag) {
return redisUtils.get(XxlJobConstant.XXL_JOB_REDIS_COOKIE_KEY_NAME);
} else {
Map<String, Object> hashMap = new HashMap<>();
hashMap.put("userName", xxlJobConfig.getUsername());
hashMap.put("password", xxlJobConfig.getPassword());
HttpResponse response = HttpRequest.post(xxlJobConfig.getAdminAddresses() +XxlJobConstant.XXL_JOB_LOGIN_URL).form(hashMap).execute();
if (HttpStatus.HTTP_OK != response.getStatus()) {
//请求失败
throw new SysException("获取xxlJob_cookie失败");
}
log.info("获取xxljob登录cookie结果: " + response.getCookieStr());
List<HttpCookie> cookies = response.getCookies();
StringBuilder sb = new StringBuilder();
for (HttpCookie cookie : cookies) {
sb.append(cookie.toString());
}
//设置过期时间7200s=2小时
redisUtils.set(XxlJobConstant.XXL_JOB_REDIS_COOKIE_KEY_NAME, sb.toString(), 7200);
return sb.toString();
}
}
/**
* 发送请求
* @param path 路径
* @param map 参数
* @return jsonObject
*/
public JSONObject sendForm(String path, Map<String, Object> map) {
String cookie = getCookie();
HttpResponse response = HttpRequest.post(path).form(map).cookie(cookie).execute();
if (HttpStatus.HTTP_OK != response.getStatus()) {
//请求失败
log.error("请求xxlJob数据失败");
}
return JSON.parseObject(response.body());
}
}