简介
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用
dashboard部署
源码包部署
github地址:GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB)
gitee地址:xxl-job: 一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
从上述仓库中下载xxl-job源码,导入idea即可,项目路径如下图所示:
初始化数据库文件
在项目的./doc/db/tables_xxl_job.sql文件即是xxl-job运行所需sql脚本文件,执行ddl语句创建运行所需的表(MYSQL)
修改相关配置文件
修改xxl-job-admin项目下的application.properties配置文件中关于数据源的配置,指向上一步执行ddl的数据源地址即可
启动dashboard
将xxl-job-admin项目打包启动即可(也可直接在idea中运行)
docker部署
初始化数据库文件
同上源码包部署方式一样
docker启动
docker run -it -d -e PARAMS="--spring.datasource.url=jdbc:mysql://192.168.56.103:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai --spring.datasource.username=root --spring.datasource.password=123456" \
-v /root/xxl-job/data/applogs:/data/applogs \
--name xxl-job-admin \
-p 8080:8080 \
xuxueli/xxl-job-admin:2.2.0
其中数据源地址根据自己的实际情况修改即可
部署成功之后访问:http://{ip}:8080/xxl-job-admin
其中默认的登录用户名和密码:admin/123456
登录之后的界面如下:
dashboard几个概念介绍
执行器:通过xxl-job注册到dashboard上的应用,可以理解成xxl-job的一个客户端
任务:注册到dashboard上的每个应用的任务
先简单理解即可,后续在源码分析篇会详细介绍
应用接入
依赖引入
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.2.0</version>
</dependency>
引入xxl-job的核心逻辑即可,注意引入版本号和dashbaord的版本一致
配置执行器
xxl-job的核心逻辑在于配置一个XxlJobExecutor执行器,其中有2个核心参数需要配置:
adminAddresses:dashboard的地址,直接配置访问dashboard的页面地址即可
appname:应用的名称,该属性用于在dashboard端分组用,在分布式环境下,相同的应用配置相同的名称
示例如下:
private static XxlJobExecutor createExecutor() {
XxlJobExecutor executor = new XxlJobExecutor();
executor.setAdminAddresses("http://192.168.56.105:8080/xxl-job-admin");
executor.setAppname("test");
return executor;
}
编写调度处理器
处理器是每个定时任务的执行逻辑,调度是发生在dashbaord,当在dashboard端配置的定时任务到达触发节点,会调用处理器逻辑完成业务处理(在后续的源码分析中会详细阐述),在使用的时候只需要集成类:com.xxl.job.core.handler.IJobHandler即可,当然在spring容器环境使用注解@xxlJob也可以(原理一样,spring通过动态代理完成注册)
实例如下:
private static class TestJobHandler extends IJobHandler{
@Override
public ReturnT<String> execute(String param) throws Exception {
System.out.println("接收调度参数是:" + param);
return ReturnT.SUCCESS;
}
}
完整示例
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.executor.XxlJobExecutor;
import com.xxl.job.core.handler.IJobHandler;
public class XxlConfig {
public static void main(String[] args) throws Exception {
XxlJobExecutor.registJobHandler("TestJobHandler",new TestJobHandler());
XxlJobExecutor executor = createExecutor();
executor.start();
Thread.currentThread().join();
}
private static XxlJobExecutor createExecutor() {
XxlJobExecutor executor = new XxlJobExecutor();
executor.setAdminAddresses("http://10.82.253.93:8080/xxl-job-admin");
executor.setAppname("test");
return executor;
}
private static class TestJobHandler extends IJobHandler{
@Override
public ReturnT<String> execute(String param) throws Exception {
System.out.println("接收调度参数是:" + param);
return ReturnT.SUCCESS;
}
}
}
启动main方法,此时可以在数据库表:xxl_job_registry中查看到相关注册信息
springboot应用中的应用
依赖引入
同上,在springboot应用中值需要引入对应的xxl-job-core包即可
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.2.0</version>
</dependency>
配置执行器
在springboot应用中配置执行器略有不同,需要配置XxlJobExecutor子类XxlJobSpringExecutor
并且作为ioc的bean注册到spring容器即可,示例代码如下:
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
log.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;
}
XxlJobSpringExecutor增加了spring的适配,做了一些额外的操作(原理和一般应用接入原理一样)
使用注解完成注册
使用注解标记相关方法即可被xxl-job识别,示例代码如下:
@XxlJob("recordDelete")
public ReturnT<String> recordDelete(String taskParam) {
log.info("start to execute oneDay delete record task!");
// 删除一周前的
deleteOneWeekBeforeRecordData();
return ReturnT.SUCCESS;
}
注意:通过注解标记xxl的方法时有如下几个规定:
1 方法的返回值必须是ReturnT类型
2 方法的参数类型必须是String类型
后续在源码分析阶段会详细说明
配置dashboard
执行器配置
当应用注册之后,需要手动到xxl-job上完成执行器的新增(这一点感觉xxl-job可以优化),如上图所示,之后xxl-job会获取到对应注册的ip地址等相关信息
任务配置
在dashbaord上:任务管理-》新增,完成任务的配置,其中执行器选择对应的appname名称,其他的一些配置,
路由策略:
在分布式环境下,当有多个实例时,根据配置的路由规则选择符合的实例调度任务
运行模式:
常用的是BEAN(也就是直接实现IJobhandler接口,其他的运行模式是实现其他的相关接口)
阻塞策略:
阻塞策略是指:当调度任务由于没有配置超时时间,导致长时间运行,知道第二次触发上一次的任务还没有结束时的处理策略,字面意思就可理解
路由策略、运行模式、阻塞处理策略的执行原理会在后续源码分析详细讲解