XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。
二、特性官网:https://www.xuxueli.com/xxl-job/
- 简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
- 动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效
- 注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行,每30秒清理一次注册表中的无效机器。同时,也支持手动录入执行器地址;
- 失败处理策略:每10秒检测失败任务,报警和重试;
- 一致性:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行
特性很多,不一一列举
三、本地搭建 1.git上下载xxl-job项目git clone https://gitee.com/xuxueli0323/xxl-job.git
2.导入数据库官网源码doc下的db文件夹里有任务调度中心需要的数据库
3.修改源码配置修改xxl-job-admin下的properties文件
-
修改端口号8080记住需改后的端口号,用于访问任务调度中心
-
修改数据库连接地址
server.port=8010 ... spring.datasource.url= spring.datasource.username= spring.datasource.password=4.新建本地demo项目
导入依赖:
切记导入SpringWeb,不导入可以试试,亲测有效
org.springframework.boot spring-boot-starter-web com.xuxueli xxl-job-core 2.3.0
修改properties:
- 任务调度中心的地址端口和上面修改的端口号要相同
- 记住xxl.job.executor.appname执行器名
# 服务端口号 server.port=8011 # log config logging.config=classpath:logback.xml # 调度中心部署跟地址:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调" xxl.job.admin.addresses=http://127.0.0.1:8010/xxl-job-admin # 执行器"AppName"和地址信息配置:AppName执行器心跳注册分组依据;地址信息用于"调度中心请求并触发任务"和"执行器注册"。执行器默认端口为9999,执行器IP默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用。单机部署多个执行器时,注意要配置不同执行器端口 xxl.job.executor.appname=job-test xxl.job.executor.ip= xxl.job.executor.port=9998 # 执行器通讯TOKEN,非空时启用 xxl.job.accessToken= # 执行器运行日志文件存储的磁盘位置,需要对该路径拥有读写权限 xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler # 执行器Log文件定期清理功能,指定日志保存天数,日志文件过期自动删除。限制至少保持3天,否则功能不生效; xxl.job.executor.logretentiondays=-1
新建logback.xml:
logback %d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n ${log.path} ${log.path}.%d{yyyy-MM-dd}.zip %date %level [%thread] %logger{36} [%file : %line] %msg%n
新建XxlJobConfig:
@ComponentScan(basePackages = "com.cj.xxljobdemo.jobhandler")
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@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 int port;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
logger.info("====xxl-job config init====");
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;
}
}
新建DemoJobHandler执行器:
记住XxlJob任务名
@Component
public class DemoJobHandler {
@XxlJob(value = "demoJobHandler111")
public void test() {
// 2.3.0版本获取参数的方式
// 注意xxl-job统一只接受一个String类型的参数,如果有多个参数,请自定义规则,获取到参数后自行切割
String param = XxlJobHelper.getJobParam();
// 打印到日志文件的方式,打印之后的文件,在调度中心的调度日志管理中,操作选项下的执行日志可查看到
XxlJobHelper.log("=====DemoJobHandler===== test XXL-JOB!");
// 执行结束后返回的方式,同样在执行日志可查看
XxlJobHelper.handleSuccess(new Date() + "执行成功");
System.out.println(new Date() + "/1=========");
}
}
四、如何使用?
1.启动xxl-job-admin服务
访问任务调度中心页面 http://localhost:8010/xxl-job-admin
初始账号密码admin/123456
2.新增执行器 3.新增任务 4.启动任务以后就大功告成了! 五、高级配置 1.避免多台服务器重复调度任务集群分布式并发环境中进行定时任务调度时,会在各个节点会上报任务,存到数据库中,执行时会从数据库中取出触发器来执行,如果执行器的名称和执行时间相同,则只有一个节点去执行此任务。
- FIRST(第一个):固定选择第一个机器;
- LAST(最后一个):固定选择最后一个机器;
- ROUND(轮询):轮流执行;
- RANDOM(随机):随机选择在线的机器;
- CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。
- LEAST_FREQUENTLY_USED(最不经常使用):使用频率最低的机器优先被选举;
- LEAST_RECENTLY_USED(最近最久未使用):最久未使用的机器优先被选举;
- FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;
- BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
- SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;
每个任务都拥有一个唯一的任务ID(任务ID可以从任务列表获取),当本任务执行结束并且执行成功时,将会触发子任务ID所对应的任务的一次主动调度。



