什么是 XXL-JOB
XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。XXL-JOB 提供了许多特性,极大简化了任务调度的开发工作,从而做到开箱即用。
XXL-JOB 的设计思想是将调度行为抽象形成 “调度中心” 公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。将任务抽象成分散的 JobHandler,交由 “执行器” 统一管理,“执行器”负责接收调度请求并执行对应的 JobHandler 中业务逻辑。
系统组成
-
调度模块(调度中心): 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块; 支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE 开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器 Failover。
-
执行模块(执行器): 负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效; 接收 “调度中心” 的执行请求、终止请求和日志请求等。
自定义任务调度模块
1、引入依赖
<!-- xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${最新稳定版本}</version>
</dependency>
2、自定义配置
/**
* XXL-job配置参数
*
*/
@Data
@ConfigurationProperties(prefix = "spring2go.xxljob")
public class XxlJobProperties {
/**
* 调度中心部署跟地址 [选填]:
* 如调度中心集群部署存在多个地址则用逗号分隔。
* 执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";
* 为空则关闭自动注册;
*/
private String adminAddresses;
/**
* 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
*/
private String appname;
/**
* 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
*/
private String address;
/**
* 执行器IP [选填]:
* 默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;
* 地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
*/
private String ip;
/**
* 执行器端口号 [选填]:
* 小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
*/
private int port;
/**
* 执行器通讯TOKEN [选填]:非空时启用;
*/
private String accessToken;
/**
* 执行器运行日志文件存储磁盘路径 [选填] :
* 需要对该路径拥有读写权限;为空则使用默认路径;
*/
private String logPath;
/**
* 执行器日志文件保存天数 [选填] :
* 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
*/
private int logRetentionDays;
/**
* 是否开启xxljob
*/
private Boolean enable = true;
}
@Configuration
@EnableConfigurationProperties(value = XxlJobProperties.class)
@ConditionalOnProperty(value = "spring2go.xxljob.enabled", havingValue = "true", matchIfMissing = true)
@Slf4j
public class XxlJobAutoConfiguration {
//声明执行器
@Bean
public XxlJobSpringExecutor xxlJobExecutor(XxlJobProperties xxlJobProperties) {
log.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(xxlJobProperties.getAdminAddresses());
xxlJobSpringExecutor.setAppname(xxlJobProperties.getAppname());
xxlJobSpringExecutor.setAddress(xxlJobProperties.getAddress());
xxlJobSpringExecutor.setIp(xxlJobProperties.getIp());
xxlJobSpringExecutor.setPort(xxlJobProperties.getPort());
xxlJobSpringExecutor.setAccessToken(xxlJobProperties.getAccessToken());
xxlJobSpringExecutor.setLogPath(xxlJobProperties.getLogPath());
xxlJobSpringExecutor.setLogRetentionDays(xxlJobProperties.getLogRetentionDays());
return xxlJobSpringExecutor;
}
}
3、自定义任务 Handler
@Component
@Slf4j
public class SampleJobHandler {
/**
* 1、简单任务示例(Bean模式)
*/
@XxlJob("demoJobHandler")
public void demoJobHandler() throws Exception {
log.info("XXL-JOB, Hello World.");
}
}
4、添加配置
spring2go:
xxljob:
enable: true
adminAddresses: http://10.192.180.193:7100/xxl-job-admin
accessToken:
appname: xxl-job-executor-sample
address:
ip:
port:
logpath: /applogs
logretentiondays: 30
5、正常启动服务,完成执行器服务的配置是逻辑实现。
启动调度中心 xxl-job-admin
1、下载源码
从 github 地址上下载源码:https://github.com/xuxueli/xxl-job
解压源码,源码结构如下:
-
xxl-job-admin:调度中心
-
xxl-job-core:公共依赖
-
xxl-job-executor-samples:执行器 Sample 示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器)
-
xxl-job-executor-sample-springboot:Springboot 版本,通过 Springboot 管理执行器,推荐这种方式;
-
xxl-job-executor-sample-frameless:无框架版本;
-
2、初始化 “调度数据库”
“调度数据库初始化 SQL 脚本” 位置为:/xxl-job/doc/db/tables_xxl_job.sql
3、配置部署 “调度中心”
调度中心项目:xxl-job-admin。作用:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台。
修改配置文件 / xxl-job/xxl-job-admin/src/main/resources/application.properties
### 调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root_pwd
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
### 报警邮箱
spring.mail.host=smtp.qq.com
spring.mail.port=25
[email protected]
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
### 调度中心通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 调度中心国际化配置 [必填]: 默认为 "zh_CN"/中文简体, 可选范围为 "zh_CN"/中文简体, "zh_TC"/中文繁体 and "en"/英文;
xxl.job.i18n=zh_CN
## 调度线程池最大线程配置【必填】
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
### 调度中心日志表数据保存天数 [必填]:过期日志自动清理;限制大于等于7时生效,否则, 如-1,关闭自动清理功能;
xxl.job.logretentiondays=30
4、部署并启动项目
调度中心访问地址:http://localhost:7100/xxl-job-admin (该地址执行器将会使用到,作为回调地址)
默认登录账号 “admin/123456”, 登录后运行界面如下图所示。
5、配置部署 “执行器项目”
启动上述自定义的任务调度模块,该模块我们定义了默认执行器和任务 handler-demoJobHandler
启动成功后,我们将看到在执行器管理多了一个在线的地址,如下图:
6、通过调度中心执行任务
通过界面化操作,触发 demoJobHandler 一次,我们将在执行器项目的输出中看到以下内容:
XXL-JOB, Hello World.
同时我们也可以通过 corn 表达式动态触发任务,至此,一个简单的调度任务就完成。
其他
xxl-job 还支持多种特性,比如支持 GLUE 在线开发任务逻辑代码模式,相比 “Bean 模式任务” 需要在执行器项目开发部署上线,更加简便轻量。
同时还支持调度中心和执行器的集群部署,调度日志等等。详情请查阅官网,官网有非常详细的描述。