最近项目中涉及到了定时任务相关需求,最终选择了分布式任务调度框架xxl-job,由于我们在使用xxl-job。这里对xxl-job 一些使用做一下简单介绍。
xxl-job 主要分为一个展示web的独立服务,另外一个是我们项目引入xxl-job依赖,对定时任务做监听。这里不对xxl-job 部署独立服务做介绍,主要介绍如何引入xxl-job依赖进行创建定时任务。
一、配置yml
# 定时任务中心配置信息
job:
server:
enabled: true
# 校验令牌,和服务器保持一致
accessToken: accessToken
userName: admin
password: xxx
jobGroup: 1
admin:
# 定时任务中心地址,通过环境变量取值,(预发布环境需填写预发布的域名,不然会调到开发环境的服务)
addresses: https://job-centerxx.com
executor:
# 执行器名称
appname: middle-executor
# 执行器的注册地址
address:
二、xxl-job 依赖
<!-- xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
三、xxl-job 启动
@Slf4j
@Configuration
@Getter
public class JobServerConfig {
@Value("${job.server.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}")
private String userName;
@Value("${job.server.password}")
private String password;
@Value("${job.server.jobGroup}")
private String jobGroup;
@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;
}
}
四、xxl-job 定时任务处理
/**
* 工单生成
*/
@XxlJob("patrolGenerateHandler")
public void maintenanceBeginNoticeHandler() {
long taskId = 0;
try {
String param = XxlJobHelper.getJobParam();
taskId = Long.parseLong(param);
System.out.println("工单生成");
} catch (Exception e) {
log.error("patrolGenerateHandler fail taskId is {}", taskId, e);
}
}
五、web端配置对应的定时任务
此时一个xxl-job 的定时任务就建立起来。
动态添加定时任务主要模拟web页面的具体操作步骤,这里先给出一个思路。不同web配置端的版本版本可能不一致,如果参数和本实例那么我们将页面上面接口和参数拷贝到代码中,进行对应http操作
这里的代码都是对这个页面上模拟,如果按照下面案例有什么不一致,可以在将web页面的参数考入代码中。
这里主要提供三个接口(一个是创建定时任务,一个是启动定时任务,另外一个删除定时任务)这里的代码通过一个数据库来管理启动定时任务情况,这里所有定时任务都是通过patrolGenerateHandler 来处理,如果标识该处理是那个定时任务这里主要通过param来分辨。
@Service
public class DynamicXxlJobService {
@Resource
private JobServerConfig jobServerConfig;
@Resource
private PatrolJobManageService patrolJobManageService;
public boolean createTaskJob(String desc, String corn, Long taskId, LocalDateTime expireLocalDateTime, LocalDateTime startLocalDate ){
Date startDate = Date.from(startLocalDate.atZone(ZoneId.systemDefault()).toInstant());
Date expireDate = Date.from(expireLocalDateTime.atZone(ZoneId.systemDefault()).toInstant());
String cookie = getCookie();
PatrolJobManage curPatrolJobManage = patrolJobManageService.getByTaskId(taskId,corn);
if(Objects.isNull(curPatrolJobManage)){
Pair<Integer, Integer> pair = generateStatus(desc, corn, taskId, startLocalDate, cookie);
int status = pair.getLeft();
int job = pair.getRight();
Date date = new Date();
PatrolJobManage patrolJobManage = PatrolJobManage.builder().cron(corn).jobId(job).status(status).type("patrol_task_generate")
.taskId(taskId).startTime(startDate).expireTime(expireDate).createTime(date).updateTime(date).build();
patrolJobManageService.save(patrolJobManage);
}else{
int status = curPatrolJobManage.getStatus();
StatusEnum statusEnum = StatusEnum.of(status);
if(statusEnum==StatusEnum.START_JOB || statusEnum==StatusEnum.EXPIRE_JOB){
return true;
}
if (statusEnum==StatusEnum.INIT) {
Pair<Integer, Integer> pair = generateStatus(desc, corn, taskId, startLocalDate, cookie);
curPatrolJobManage.setStatus(pair.getLeft());
curPatrolJobManage.setJobId(pair.getRight());
curPatrolJobManage.setUpdateTime(new Date());
patrolJobManageService.updateById(curPatrolJobManage);
}
if (statusEnum==StatusEnum.START_JOB && startLocalDate.compareTo(LocalDateTime.now()) <= 0) {
Integer jobId = curPatrolJobManage.getJobId();
if (start(cookie, jobId)) {
curPatrolJobManage.setStatus(StatusEnum.START_JOB.getCode());
curPatrolJobManage.setUpdateTime(new Date());
patrolJobManageService.updateById(curPatrolJobManage);
}
}
}
return true;
}
private Pair<Integer, Integer> generateStatus(String desc, String corn, Long taskId,
LocalDateTime startLocalDate,String cookie){
int job = createJob(cookie, desc, corn, String.valueOf(taskId));
int status = StatusEnum.INIT.getCode();
if (job == -1) {
status = StatusEnum.INIT.getCode();
} else {
status = StatusEnum.CREATE_JOB.getCode();
if (startLocalDate.compareTo(LocalDateTime.now()) <= 0) {
if (start(cookie, job)) {
status = StatusEnum.START_JOB.getCode();
}
}
}
return Pair.of(status, job);
}
/**
* 创建固定任务
*
* @param desc 任务描述
* @param corn cron 表达式
* @param param param
* @return jobId
*/
private int createJob(String cookie, String desc, String corn, String param) {
int jobId = -1;
Map<String, String> paramMap = new HashMap<>(8);
paramMap.put("jobGroup", jobServerConfig.getJobGroup());
paramMap.put("jobDesc", desc);
paramMap.put("author", "system_patrol");
paramMap.put("scheduleType", "CRON");
paramMap.put("scheduleConf", corn);
paramMap.put("cronGen_display", corn);
paramMap.put("glueType", "BEAN");
paramMap.put("executorHandler", "patrolGenerateHandler");
// 此处hander需提前在项目中定义
paramMap.put("executorParam", param);
paramMap.put("executorRouteStrategy", "FIRST");
paramMap.put("misfireStrategy", "DO_NOTHING");
paramMap.put("executorBlockStrategy", "SERIAL_EXECUTION");
paramMap.put("executorTimeout", "0");
paramMap.put("executorFailRetryCount", "0");
paramMap.put("glueRemark", "GLUE代码初始化");
if(StringUtils.isNoneBlank(cookie)){
cookie = getCookie();
}
HashMap<String, String> headMap = new HashMap<>();
headMap.put("cookie", cookie);
String s = OkHttpClientUtil.doPost(jobServerConfig.getAdminAddresses() + "/jobinfo/add", paramMap, headMap);
JSONObject jsonObject = JSON.parseObject(s);
int code = jsonObject.getIntValue("code");
if (code == 200) {
jobId = jsonObject.getIntValue("content");
}
return jobId;
}
/**
* 启动固定任务
* @param cookie cookie
* @param jobId jobId
* @return 启动固定任务
*/
private boolean start(String cookie,int jobId){
Map<String, String> paramMap = new HashMap<>(4);
paramMap.put("id", String.valueOf(jobId));
HashMap<String, String> headMap = new HashMap<>(4);
if(StringUtils.isEmpty(cookie)){
cookie = getCookie();
}
headMap.put("cookie", cookie);
String s = OkHttpClientUtil.doPost(jobServerConfig.getAdminAddresses() + "/jobinfo/start", paramMap, headMap);
JSONObject jsonObject = JSON.parseObject(s);
int code = jsonObject.getIntValue("code");
if (code == 200) {
return true;
}
return false;
}
/**
* 删除固定任务
* @param cookie cookie
* @param jobId jobId
* @return 启动固定任务
*/
public boolean remove(String cookie,int jobId){
Map<String, String> paramMap = new HashMap<>(4);
paramMap.put("id", String.valueOf(jobId));
HashMap<String, String> headMap = new HashMap<>(4);
if(StringUtils.isEmpty(cookie)){
cookie = getCookie();
}
headMap.put("cookie", cookie);
String s = OkHttpClientUtil.doPost(jobServerConfig.getAdminAddresses() + "/jobinfo/remove", paramMap, headMap);
JSONObject jsonObject = JSON.parseObject(s);
int code = jsonObject.getInteger("code");
if (code == 200) {
return true;
}
return false;
}
/**
* 获取cookie
* @return 返回cookie值
*/
public String getCookie() {
String path = jobServerConfig.getAdminAddresses() + "/login";
Map<String, Object> hashMap = new HashMap();
hashMap.put("userName", jobServerConfig.getUserName());
hashMap.put("password", jobServerConfig.getPassword());
HttpResponse response = HttpRequest.post(path).form(hashMap).execute();
List<HttpCookie> cookies = response.getCookies();
StringBuilder sb = new StringBuilder();
for (HttpCookie cookie : cookies) {
sb.append(cookie.toString());
}
return sb.toString();
}
}
原网址: 访问
创建于: 2022-05-19 19:23:39
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
最新评论