xxjob分布式定时任务简单入门和改造

xxjob简介

XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

xxjob官网下载地址


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

xxjob下载源码

github地址:https://github.com/xuxueli/xxl-job/

码云地址:https://gitee.com/xuxueli0323/xxl-job

使用指南

第一步:执行数据库脚本并修改XxlJobAdminApplication数据库链接即可

第二步:启动XxlJobAdminApplication管理界面

第三步:启动示例执行器 XxlJobExecutorApplication

简单三步就完成了一个分布式定时任务的入门使用。

 

需求:

xxjob定时任务需要人工去创建,期望能通过代码去创建和删除和修改定时任务,实现一种延迟任务的功能。

第一步:改造

xxjob管理界面的任务增删改查都是通过这个类去控制的JobInfoController,只不过需要后台权限鉴权。

所以我们拷贝JobInfoController这个类,命名为JobInfoApiController,并加上接口权限注解无鉴权,这里只为演示,所以实际业务中要使用的话,需要对这几个接口做权限检验,比如可以用官方提供的token机制鉴权等。

改造完后,我们重启项目。

xxjob分布式定时任务简单入门和改造_第1张图片

 

第二步:生成cron表达式

这里我们就想让程序在指定的时间帮我们执行任务,只执行一次,所以会精确到未来的秒分时日月,年可以忽略,因为业务需求就执行一次,执行完后,会删除该任务。

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

 

第三步:发送http请求去创建定时任务

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的延迟任务。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA3NzIyMzA=,size_16,color_FFFFFF,t_70

 

 

 

你可能感兴趣的:(java,定时任务,分布式)