XXL-JOB 2.3.0 使用概述
一、xxl-job是什么?
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,不导入可以试试,亲测有效
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
修改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:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">
<contextName>logback</contextName>
<property name="log.path" value="/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log"/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
</configuration>
新建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 {
/**
* 2.3.0版本
*/
@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(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;
2.子任务:
每个任务都拥有一个唯一的任务ID(任务ID可以从任务列表获取),当本任务执行结束并且执行成功时,将会触发子任务ID所对应的任务的一次主动调度。