分布式调度XXL-JOB - 详解
1.概述
1.1、XXL-JOB介绍
XXL-Job:是大众点评的分布式任务调度平台,是一个轻量级分布式任务调度平台, 其核心设计目标是开发迅速、学习简单、轻量级、易扩展。
官网地址: 分布式任务调度平台XXL-JOB/
1.1.1 系统架构图
1.1.2 设计思想
将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。
将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。
因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;
2.快速入门
2.1、下载源码
2.1.1 源码下载地址:
github:https://github.com/xuxueli/xxl-job
gitee:https://gitee.com/xuxueli0323/xxl-job
2.2、初始化调度数据库
clone项目源码,获取 “调度数据库初始化SQL脚本” 并执行即可,“调度数据库初始化SQL脚本” 位置为:
/xxl-job/doc/db/tables_xxl_job.sql
2.3、maven 编译源码
解压源码,按照maven格式将源码导入IDE, 使用maven进行依赖引入即可,源码结构如下:
2.4、 配置部署调度中心
2.4.1 调度中心配置
修改xxl-job-admin
项目的配置文件application.properties
,把数据库账号密码配置上
### web
server.port=8088
server.servlet.context-path=/xxl-job-admin
### actuator
management.server.servlet.context-path=/actuator
management.health.mail.enabled=false
### resources
spring.mvc.servlet.load-on-startup=0
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/
### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.##########
### mybatis
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
#mybatis.type-aliases-package=com.xxl.job.admin.core.model
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://192.168.202.200:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=WolfCode_2017
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
### datasource-pool
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.connection-timeout=10000
spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.hikari.validation-timeout=1000
### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.from=xxx@qq.com
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
### xxl-job, access token
xxl.job.accessToken=default_token
### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en")
xxl.job.i18n=zh_CN
## xxl-job, triggerpool max size
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
### xxl-job, log retention days
xxl.job.logretentiondays=30
2.4.2 部署项目
运行XxlJobAdminApplication
程序即可.
调度中心访问地址: http://localhost:8088/xxl-job-admin
默认登录账号 “admin/123456”, 登录后运行界面如下图所示。
至此“调度中心”项目已经部署成功。
2.5 配置部署执行器项目
2.5.1 添加Maven依赖
创建SpringBoot项目集成xxl-job并且添加如下依赖:
org.springframework.boot spring-boot-dependencies 2.4.2 pom import
org.projectlombok lombok org.mapstruct mapstruct 1.4.2.Final org.mapstruct mapstruct-processor 1.4.2.Final org.springframework.boot spring-boot-starter-log4j2 2.4.2 com.alibaba fastjson 1.2.24 com.google.guava guava 19.0 org.apache.commons commons-lang3 3.11
org.springframework.boot spring-boot-starter-data-redis logback-classic ch.qos.logback spring-boot-starter-logging org.springframework.boot
com.fasterxml.jackson.core jackson-databind
org.springframework.boot spring-boot-starter-web
mysql mysql-connector-java
org.springframework.boot spring-boot-starter-jdbc com.alibaba druid-spring-boot-starter 1.2.15
org.mybatis.spring.boot mybatis-spring-boot-starter 2.2.2 com.baomidou mybatis-plus-boot-starter 3.5.1 com.xuxueli xxl-job-core 2.3.1
2.5.2 执行器配置
在配置yaml文件中添加如下配置:
xxl:job: admin: ### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册; addresses: http://127.0.0.1:8088/xxl-job-admin ### 执行器通讯TOKEN [选填]:非空时启用; accessToke: default_token executor: ### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册 appname: xxl-job-executor-sample ### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务"; ip: 127.0.0.1 ### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口; port: 9999 ### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径; logpath: /data/applogs/xxl-job/jobhandler ### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能; logretentiondays: 30
2.5.3 添加执行器配置
创建XxlJobConfig
配置对象:
@Configuration
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() { 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; }
}
2.5.4 添加任务处理类
添加任务处理类,交给Spring容器管理,在处理方法上贴上@XxlJob
注解Demo
@Component
public class XxlJobController { @XxlJob("demoXXjob") public void demoXXjob() throws Exception { System.out.println("执行定时任务,执行时间:"+new Date()+"Hello xxl-job"); }
}
2.5.5 实战代码
@Component
public class XxlJobController { //自建表做查询,省略建表与查询业务 @Resource private SubjectCategoryService subjectCategoryService;
@XxlJob("selectEamInfo") public void selectEamInfo() throws Exception { Result> listResult = subjectCategoryService.searchInfo(); listResult.getData().forEach(result->{ System.out.println(result); }); System.out.println("执行定时任务,执行时间:"+new Date()); }
}
2.6 运行程序
2.6.1 任务配置&触发执行
登录调度中心,在任务管理中新增任务,配置内容如下:
新增后界面如下:
接着启动定时调度任务
2.6.2 查看日志
在调度中心的调度日志中就可以看到,任务的执行结果.
管控台也可以看到任务的执行信息.
2.6.3、实战效果如下
配置xxljob表达式:
执行一次验证
日志查看
后台查看
即xxl_job集成springboot项目成功。