XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
https://www.xuxueli.com/xxl-job/#%E3%80%8A%E5%88%86%E5%B8%83%E5%BC%8F%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6%E5%B9%B3%E5%8F%B0XXL-JOB%E3%80%8B
github地址:https://github.com/xuxueli/xxl-job/
码云地址:https://gitee.com/xuxueli0323/xxl-job
使用指南
第一步:执行数据库脚本并修改XxlJobAdminApplication数据库链接即可
第二步:启动XxlJobAdminApplication管理界面
第三步:启动示例执行器 XxlJobExecutorApplication
简单三步就完成了一个分布式定时任务的入门使用。
xxjob定时任务需要人工去创建,期望能通过代码去创建和删除和修改定时任务,实现一种延迟任务的功能。
xxjob管理界面的任务增删改查都是通过这个类去控制的JobInfoController,只不过需要后台权限鉴权。
所以我们拷贝JobInfoController这个类,命名为JobInfoApiController,并加上接口权限注解无鉴权,这里只为演示,所以实际业务中要使用的话,需要对这几个接口做权限检验,比如可以用官方提供的token机制鉴权等。
改造完后,我们重启项目。
这里我们就想让程序在指定的时间帮我们执行任务,只执行一次,所以会精确到未来的秒分时日月,年可以忽略,因为业务需求就执行一次,执行完后,会删除该任务。
private static String getCron(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date); //放入Date类型数据
int month = calendar.get(Calendar.MONTH)+1; //获取月份
int day = calendar.get(Calendar.DATE); //获取日
int hour =calendar.get(Calendar.HOUR_OF_DAY); //时(24小时制)
int minute = calendar.get(Calendar.MINUTE); //分
int second = calendar.get(Calendar.SECOND); //秒
StringBuffer cron = new StringBuffer();
cron.append(second).append(" ")
.append(minute).append(" ")
.append(hour).append(" ")
.append(day).append(" ")
.append(month).append(" ")
.append("?");
return cron.toString();
}
XxlJobInfo这个类,封装了任务的各种参数,可以根据业务需要自行定义
简单写个main方法即可
添加定时任务
public static void main(String[] args) {
String url = "http://127.0.0.1:8080/xxl-job-admin/jobinfoApi/add";
RestTemplate restTemplate = new RestTemplate();
MultiValueMap mulmap = new LinkedMultiValueMap<>();
mulmap.add("jobGroup", "2");
mulmap.add("jobDesc", "测试创建");
mulmap.add("author", "bread");
mulmap.add("alarmEmail", "");
mulmap.add("scheduleType", "CRON");
mulmap.add("scheduleConf", getCron(new Date()));
mulmap.add("cronGen_display", getCron(new Date()));
mulmap.add("schedule_conf_CRON", getCron(new Date()));
mulmap.add("glueType", "BEAN");
mulmap.add("executorHandler", "demoJobHandler");
mulmap.add("executorRouteStrategy", "CONSISTENT_HASH");
mulmap.add("misfireStrategy", "DO_NOTHING");
mulmap.add("executorBlockStrategy", "SERIAL_EXECUTION");
mulmap.add("executorTimeout", "0");
mulmap.add("executorFailRetryCount", "0");
mulmap.add("glueRemark", "GLUE代码初始化");
mulmap.add("triggerStatus", "1");
HttpHeaders headers = new HttpHeaders();
headers.put("Auth-Token", Collections.singletonList("token"));
HttpEntity> request = new HttpEntity<>(mulmap, headers);
ResponseEntity response;
try {
response= restTemplate.exchange(url, HttpMethod.POST, request, String.class);
} catch (org.springframework.web.client.ResourceAccessException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
System.out.println("执行完了");
}
删除定时任务
public static void main(String[] args) {
String url = "http://127.0.0.1:8080/xxl-job-admin/jobinfoApi/remove";
RestTemplate restTemplate = new RestTemplate();
MultiValueMap mulmap = new LinkedMultiValueMap<>();
mulmap.add("id", "2");
HttpHeaders headers = new HttpHeaders();
headers.put("X-Auth-Token", Collections.singletonList("token"));
HttpEntity> request = new HttpEntity<>(mulmap, headers);
ResponseEntity response;
try {
response= restTemplate.exchange(url, HttpMethod.POST, request, String.class);
} catch (org.springframework.web.client.ResourceAccessException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
System.out.println("执行完了");
}
正常创建了任务,并且能执行,over.,这样子就能精准的控制任务的执行时间,并且只执行一次。类似mq的延迟任务。