简介
在平时的业务场景中,经常有一些场景需要使用定时任务,比如:
- 时间驱动的场景:某个时间点发送优惠券,发送短信等等
- 批量处理数据:批量统计上个月的账单,统计上个月销售数据等等
- 固定频率的场景:每隔5分钟需要执行一次
所以定时任务在平时开发中并不少见,而且对于现在快速消费的时代,每天都需要发送各种推送消息都可以依赖定时任务去完成,应用非常广泛。
XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单,轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
官网:https://www.xuxueli.com/xxl-job/
从架构图可以看出,分别有调度中心和执行器两大组成部分。
- 调度中心:负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。支持可视化界面,可以在调度中心对任务进行新增,更新,删除,会实时生效。支持监控调度结果,查询执行日志,查看调度任务统计报表,任务失败告警等等。
- 执行器:负责接收调度请求,执行调度任务的业务逻辑。执行器启动后需要注册到调度中心。接收调度中心的发出的执行请求,终止请求,日志请求等等。
接下来我们看一下XXL-JOB的工作原理。
- 任务执行器根据配置的调度中心的地址,自动注册到调度中心
- 达到任务触发条件,调度中心下发任务
- 执行器基于线程池执行任务,并把执行结果放入内存队列中,把执行日志写入日志文件中
- 执行器的回调线程消费内存队列中的执行结果,主动上报给调度中心
- 当用户在调度中心查看任务日志,调度中心请求任务执行器,任务执行器读取任务日志文件并返回日志详情
XXL-JOB设计思想
设计思想:
- 将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求
- 将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑
因此,“调度”和“任务”两部分可以互相解耦,提高系统整体稳定性和扩展性。
1.下载源码
GitHub下载地址:github.com/xuxueli/xxl…
Gitee下载地址:gitee.com/xuxueli0323…
2.初始化数据库
-
执行tables_xxl_job.sql文件初始化
-
调度中心支持集群部署,集群情况下各节点务必连接同一个mysql实例;
-
如果mysql做主从,调度中心集群节点务必强制走主库;
-
xxl_job_lock:任务调度锁表;
-
xxl_job_group:执行器信息表,维护任务执行器信息;
-
xxl_job_info:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
-
xxl_job_log:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
-
xxl_job_log_report:调度日志报表:用户存储XXL-JOB任务调度日志的报表,调度中心报表功能页面会用到;
-
xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
-
xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;
-
xxl_job_user:系统用户表;
3.配置部署 调度中心
调度中心项目:xxl-job-admin
作用:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台。
3.1主要修改配置
-
修改数据源
-
修改报警邮箱
-
调度中心通讯TOKEN
#xxl-job, datasource spring.datasource.url=jdbc:mysql://localhost:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#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=你的mail token 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, access token xxl.job.accessToken=wpztoken
3.2.打包部署 调度中心
mvn clean package -Dmaven.test.skip=true
3.3.访问调度中心
调度中心访问地址:http://localhost:8080/xxl-job-admin (该地址执行器配置文件xxl.job.admin.addresses将会使用到,作为回调地址)
默认登录账号 “admin/123456”,登录后运行界面如下所示:
XXL-JOB 任务执行原理
任务调度中心发送任务执行请求
任务发送执行的操作有两种:
(1)根据配置的corn表达式周期性执行相关任务
(2)在任务调度中心主动执行任务
任务执行过程分析 :blog.csdn.net/qq924862077…
常用的分布式任务调度系统
- xxl-job:是大众点评员工徐雪里于2015年发布的分布式任务调度平台,是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展
- Quartz:Java事实上的定时任务标准。但Quartz关注点在于定时任务而非数据,并无一套根据数据处理而定制化的流程。虽然Quartz可以基于数据库实现作业的高可用,但缺少分布式并行调度的功能
- TBSchedule:阿里早期开源的分布式任务调度系统。代码略陈旧,使用timer而非线程池执行任务调度。众所周知,timer在处理异常状况时是有缺陷的。而且TBSchedule作业类型较为单一,只能是获取/处理数据一种模式。还有就是文档缺失比较严重
- elastic-job(E-Job):当当开发的弹性分布式任务调度系统,功能丰富强大,采用zookeeper实现分布式协调,实现任务高可用以及分片,目前是版本2.15,并且可以支持云开发
- Saturn:是唯品会自主研发的分布式的定时任务的调度平台,基于当当的elastic-job 版本1开发,并且可以很好的部署到docker容器上