目录
一、XXL-JOB简述
XXL-JOB是一个分布式任务调度平台;核心设计目标是学习简单、开发迅速、轻量级、易扩展
部分特性:
1、调度采用中心式设计,任务分布式执行;调度中心和任务执行器都支持集群部署
2、执行器会自动注册任务, 调度中心将会自动触发任务执行;
3、一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;
4、提供多种触发策略:Cron触发、固定间隔触发、固定延时触发、API(事件)触发、人工触发;
5、调度过于频繁,任务来不及处理时,可采用的策略有:
单机串行(默认):调度请求进入单机执行器后,请求进入FIFO队列并以串行方式运行;
丢弃后续调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败;
覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务
6、支持自定义任务超时时间,任务运行超时将会主动中断任务;
7、可以自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;
8、任务失败告警:默认提供邮件方式失败告警;配置多个邮箱地址时用逗号分隔
9、支持多种脚本任务,包括Shell、Python、NodeJS、PHP、PowerShell等类型脚本;
10、采用集群部署时,有多种丰富路由策略
故障转移:如果执行器集群中某一台机器故障,将会自动切换到正常的执行器发送调度请求
第一个:固定选择第一个机器;
最后一个:固定选择最后一个机器;
轮询:依次选取执行器管理的注册地址列表中的执行器;
随机:在执行器管理的注册地址列表中随机选取一个在线的机器;
一致性HASH:每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上;
最不经常使用:使用频率最低的机器优先被选举;
最近最久未使用:最久未使用的机器优先被选举;
忙碌转移:按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
分片广播:广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;
二、搭建xxl-Job
环境
Maven3+
Jdk1.8+
Mysql8.0+
2.1 执行初始化sql脚本
将源码下载并解压后,找到/xxl-job/doc/db/tables_xxl_job.sql文件到数据库中执行
其中:
xxl_job_group:执行器信息表,维护任务执行器信息;
xxl_job_info:调度扩展信息表, 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
xxl_job_lock:任务调度锁表;
xxl_job_log:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
xxl_job_log_report:调度日志报表:用户存储XXL-JOB任务调度日志的报表,调度中心报表功能页面会用到;
xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
GLUE是一种任务调度模式,允许用户直接在调度中心编写和执行任务代码,而无需将代码部署到执行器。
xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;
xxl_job_user:系统用户表;
2.2 引入依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.1</version>
</dependency>
2.3 xxl-job配置
源码的调度中心配置文件位置
/xxl-job/xxl-job-admin/src/main/resources/application.properties;
项目中配置中心的配置:
application.yml:
server:
#配置中心端口;与执行器中配置保持一致
port: 8080
servlet:
context-path: /xxl-job-admin
management:
server:
servlet:
context-path: /actuator
health:
mail:
enabled: false
#mybatis
mybatis:
mapper-locations: classpath:/mybatis-mapper/*Mapper.xml
spring:
#配置数据源信息
datasource:
url: jdbc:mysql://127.0.0.1:3306/xxl_job
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
#多数据源
type: com.zaxxer.hikari.HikariDataSource
hikari:
pool-name: 连接池的名
minimum-idle: 10
maximum-pool-size: 20
auto-commit: true
idle-timeout: 30000
max-lifetime: 900000
connection-timeout: 10000
connection-test-query: SELECT 1
validation-timeout: 1000
# 报警邮箱
mail:
host: smtp.qq.com
port: 25
username: xxx@qq.com
from: xxx@qq.com
password: xxx
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
socketFactory:
class: javax.net.ssl.SSLSocketFactory
xxl:
job:
#执行器通讯TOKEN [选填]:非空时启用;
accessToken: default_token
#调度中心国际化配置 [必填]: 默认为 "zh_CN"/中文简体
i18n: zh_CN
# 调度线程池最大线程配置【必填】
triggerpool:
fast:
max: 200
slow:
max: 100
# 调度中心日志表数据保存天数 [必填]
logretentiondays: 30
执行器的配置:
源代码位置:/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties
项目中配置:
xxl-job.yml
xxl:
job:
admin:
#调度中心部署根地址 [选填],执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调"
addresses: http://127.0.0.1:8080/xxl-job-admin
#执行器通讯TOKEN [选填]
accessToken: default_token
executor:
appname: testJob
#执行器IP [选填]:默认为空表示自动获取IP
address:
ip:
#执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
port: 9999
#执行器运行日志文件存储磁盘路径
logpath: /data/applogs/xxl-job/jobhandler
# 执行器日志文件保存天数 [选填]
logretentiondays: 30
2.4 执行器组件
源代码位置:/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java
项目中使用:
@Configuration
@Slf4j
public class XxlJobConfig {
@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() {
log.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;
}
}
2.5 开发任务
BEAN模式(方法形式):每个任务只需要开发一个方法,并添加”@XxlJob”注解即可
@XxlJob("jobHandler")
public void jobHandler() throws Exception {
XxlJobHelper.log("执行成功");
}
2.6 访问调度中心
地址:http://localhost:8080/xxl-job-admin (该地址执行器将会使用到,作为回调地址)
默认登录账号 “admin/123456”
想要修改登陆密码时:
用默认密码(amdin/123456)登陆web页面,然后右上角点击修改密码
或者直接数据库中修改密码(采用MD5算法32位小写加密)
三、Cron表达式
是一个用于定义计划任务执行时间的字符串
{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}
秒:0-59之间的整数,可选
分:0-59之间的整数,可以使用“”表示每分钟,“-”表示范围,“/”表示步长
时:0-23之间的整数
日:1-31之间的整数,可以使用“”表示每月的每一天,“L”表示月的最后一天,“?”表示不指定日期
月:1-12之间的整数或JAN-DEC
周:1-7之间的整数或SUN-SAT,1表示星期天,2表示星期一。可以使用“?”表示不指定星期几,使用“L”表示月的最后一个工作日
示例:
- 表示所有值,可解读为 “每”
0 0 1 * * ? 每天凌晨1点执行
0 3 0 1 * ? 每个月的1号凌晨3点执行
/ 在某个域上周期性触发
0 */1 * * * ? 每隔1分钟执行一次
0 0/3 14 * * ? 在每天下午2点到下午2:55期间的每3分钟触发一次
- 表示时间段
0 0-3 14 * * ? 在每天下午2点到下午2:03期间的每1分钟触发一次
, 指的是在两个以上的时间点中都执行
0 0/3 14,15 * * ? 在每天下午2点到下午2:55期间以及3点到3点55期间每3分钟触发一次
L 表示英文中的LAST 的意思,只能在 “日”和“周”中使用
0 0 20 L * ? 每月最后一天20点执行一次
W 表示离指定日期的最近那个工作日(周一至周五)触发
0 10 10 LW * ? 每个月最后一个工作日的10点10触发任务
#表示每月的第几个周几,只能作用于 “周” 上
0 10 10 ? * 5#3 每个月第三周的星期四的10点10分触发任务
注意:
日期冲突:
日期和星期字段通常不会同时指定,因为它们可能会产生冲突。
如果同时指定了这两个字段,Cron表达式会优先匹配日期字段