1、概述
XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。xxl三个字母是其开发者许雪里名字的缩写。
几个特性:
1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效
3、注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行,每30秒清理一次注册表中的无效机器。同时,也支持手动录入执行器地址;
4 、失败处理策略:每10秒检测失败任务,报警和重试;
5、一致性:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行
6、执行器HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA
7、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务
2、架构
3、在xuxueli项目中使用
从git拉取代码:xxl-job: 一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 - Gitee.com拉取项目后运行项目自带的tables_xxl_job.sql文件,在Navcat中去运行,生成需要的表
表描述
表名 | 描述 |
---|---|
xxl_job_group | 执行器分组 |
xxl_job_info | 任务信息 |
xxl_job_lock | 任务通知分布式锁 |
xxl_job_log | 任务执行日志 |
xxl_job_log_report | 日志报告 |
xxl_job_logglue | glue模式任务日志 |
xxl_job_registry | 执行器注册信息 |
xxl_job_user | 用户表 |
项目个模块说明
xxl-job-admin:调度中心
xxl-job-core:公共依赖
xxl-job-executor:执行器Sample示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器)
xxl-job-executor-sample-spring:Spring版本,通过Spring容器管理执行器,比较通用,推荐这种方式;
xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器;
xxl-job-executor-sample-jfinal:JFinal版本,通过JFinal管理执行器;
xxl-job-executor-sample-nutz:Nutz版本,通过Nutz管理执行器;
这里选择springboot执行器
admin配置文件
打开xxl-job-admin模块,在application.properties中进行后台的配置
执行器模块的配置文件
启动拉取的项目:
先启动admin模块,在启动执行器模块。
我们启动XxlJobAdminApplication类和XxlJobExecutorApplication,访问http://localhost:8080/xxl-job-admin 默认账户admn,密码123456
输入账号密码后即可进入系统
配置成功执行器,就会看到下图,要不然online及其地址是空的(可能会看不到自己配置的执行器,可以手动添加不输入地址,默认会自动寻找对于执行器的地址的)
编写自己的定时逻辑
定位到springboot模块下的jobhandler层下面
在任务管理里面新增任务
注意这里的JobHandler对应@XxlJob注解里面的名称
然后在找到刚刚添加的任务,点击操作里面的启动
可以看到结果,刚刚编写的代码已经被执行了
4、SpringBoot集成
新建项目并引入依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
添加配置文件
server:
# 注意xxljob使用的端口为8080,所以这里需要指定端口号不为8080(默认为8080),防止冲突
# 如果xxljob不为8080或者不在同一个服务器上,则不用指定
port: 8081
xxl:
job:
admin:
# xxl-job后台管理界面的地址
addresses: http://127.0.0.1:8080/xxl-job-admin
executor:
# 此执行器的名称
appname: first-xxljob
# 此执行器的端口
port: 38801
# 此执行器的日志存放路径
logpath: D:/gitload_pro/xxl-job/log
# 此执行器的日志保存时间
logretentiondays: 1
添加配置类
将xxl-job-executor-sample-springboot这个模块下的XxlJobConfig复制一份到项目中,然后将相关配置设置好即可。
注意:这里将accessToken、address、ip给注释了,因为上面的配置文件没有写,不注释会报错
package com.zut.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* xxl-job config
*
* @author xuxueli 2017-04-28
*/
@Configuration
@RequiredArgsConstructor
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
/*@Value("${xxl.job.accessToken}")
private String accessToken;*/
@Value("${xxl.job.executor.appname}")
private String appname;
/*@Value("${xxl.job.executor.address}")
private String address;
@Value("${xxl.job.executor.ip}")
private String ip;*/
@Value("${xxl.job.executor.port}")
private int port;
@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.setAddress(address);
//xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
//xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
/**
* 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
*
* 1、引入依赖:
* <dependency>
* <groupId>org.springframework.cloud</groupId>
* <artifactId>spring-cloud-commons</artifactId>
* <version>${version}</version>
* </dependency>
*
* 2、配置文件,或者容器启动变量
* spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
*
* 3、获取IP
* String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
*/
}
创建自己的定时任务
@Component
public class MyJob {
@XxlJob("SpringBoot—XXLJob")
public void test(){
System.out.println("This is SpringBoot XXLJob Test!");
}
}
在xxl-job-admin页面添加执行器
注意:我们可以将xxl-job-admin项目拷到自己的项目,或者将其单独部署在服务器并启动
登录:http://localhost:8080/xxl-job-admin admin/123456
点击执行器管理==》新增
此处的AppName填你项目中配置的xxl.job.executor.appname名称。选择自动注册,保存即可。
添加任务
点击任务管理==》点击执行器下拉框
选择刚刚添加的执行器,然后点击“新增”按钮,新增任务:
启动自己的项目
注意,此处的JobHandler填@XxlJob注解里面的值。填好点击保存即可。就可以看到我们已经有一条任务了,此时点击“操作”,然后点击“启动”,定时任务就运行了。笔者这里是每5秒运行一次。
测试
5、将xxl-job部署在docker上
编写docker-compose.yml
version: "1
services:
xxl_job_admin:
# 指定容器名称
container_name: xxl_job_admin
# 重启机制
restart: always
image: openjdk:8
volumes:
# 本地jar包路径
- /usr/soft/jars/xxl-job-admin-2.3.0.jar:/usr/soft/jars/xxl-job-admin-2.3.0.jar
# 本地脚本路径
- /usr/soft/xxljob_shell/xxl-job-admin-2.3.0.sh:/usr/soft/xxljob_shell/xxl-job-admin-2.3.0.sh
# 挂载日志 -v A:B ,A指宿主机位置,B指容器位置
- /usr/soft/logs/xxl_job_admin:/data/applogs
# 指定容器时间为宿主机时间
- /etc/localtime:/etc/localtime
# 访问端口
ports:
- "8080:8080"
environment:
# 指定时区
- TZ="Asia/Shanghai"
#启动容器后执行的命令
entrypoint: sh /usr/soft/xxljob_shell/xxl-job-admin-2.3.0.sh
启动脚本,也就是上一步最后一行的脚本
上传到:/usr/soft/xxljob_shell/xxl-job-admin-2.3.0.sh
nohup java -Duser.timezone=Asia/Shanghai
-jar /usr/soft/jars/xxl-job-admin-2.3.0.jar
--server.port=8080 >/dev/null 2>&1
构建容器
docker-compose -f docker-compose.yml up -d
执行上面的脚本
./xxl-job-admin-2.3.0.sh
如果没有权限执行赋权命令:chmod 777 xxl-job-admin-2.3.0.sh
查看是否部署成功
将http://127.0.0.1:8080/xxl-job-admin/toLogin换成自己服务器的ip和指定的端口
出现下图表示部署成功
将自己项目的ip和端口改成服务器上部署的端口和ip,然后上传到服务器,执行命令
java -jar jar包名称
在上面的页面启动定时任务
发现定时任务已经启动