XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
基本可以满足所有定时任务调度需求:灵活配置调度时间、分配策略、大任务拆分、容错、调度日志、仪表盘、报警
分为两部分:可视化得任务调度中心和任务执行器
整体搭建测试步骤
启动任务调度中心服务并新增执行器(appname)->创建执行器工程并编写任务逻辑(jobHandler)->启动任务执行器注册到调度中心(对应于第一步创建的appname)->调度中心页面创建任务执行
demo代码: github.com/lidefu1993/… (easy-java-job-admin、easy-java-job )
任务调度中心服务
1、创建mysql数据库,xxl-job,执行对应版本的mysql脚本创建基础表
2、下载 xxl-job-2.2.0 源码,提取xxl-job-admin部分代码,修改pom.xml(源admin依赖xxx-job父级工程),修改application.properties(mysql配置, email配置)
3、启动springboot工程,访问 http://ip:port/xxl-job-admin

任务调度中心启动完成
4、创建执行器,方便后续执行器注册过来
创建任务执行器时的appname对应于此处创建的appname

创建执行器工程
1、创建springboot工程,引入xxl-job-core依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.2.0</version>
</dependency>
2、修改application.properties
server.port=8086
##必须要有该项 否则注册不到指定的appname下
server.servlet.context-path=/my-job
### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://localhost:8085/xxl-job-admin
### 执行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 执行器AppName [选填]:执行器心跳注册分组依据(要对应已经存在的appName);为空则关闭自动注册
xxl.job.executor.appname=xxl-job-executor-sample
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=10004
##执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=-1
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=logs/xxl-job
3、创建启动类,配置调度中心,任务逻辑
package com.ldf.easy;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
/**
* @author lidefu
* @date 2020年07月10日14:26
**/
@SpringBootApplication
public class JobApp {
public static void main(String[] args) {
SpringApplication.run(JobApp.class, args);
}
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appName;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private Integer port;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private Integer logRetentionDays;
/**
* 调度中心配置
*/
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appName);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
/**
* 任务逻辑
* @param param 传入参数
* @return -
* @throws InterruptedException-
*/
@XxlJob("demoJobHandler")
public ReturnT<String> execute(String param) throws InterruptedException {
System.out.println("-----------------job1 begin----------------");
System.out.println("param:" + param);
for(int i = 0; i<3; i++){
System.out.println("hello world. com.ldf.easy.Job2App : " + i);
Thread.sleep(1000);
}
System.out.println("-----------------job1 end----------------");
return ReturnT.SUCCESS;
}
}
4、启动执行器,查看调度中心对应的执行器下的OnLine机器地址

已成功注册
5、创建任务
在任务调度中心-任务管理新增任务,选择对应的执行器,JobHandler为 @XxlJob("demoJobHandler")的值:demoJobHandler

6、启动任务
