官方文档地址
项目开发中,常常以下场景需要分布式任务调度:
1、同一服务多个实例的任务存在互斥时,需要统一协调
2、定时任务的执行需要支持高可用、监控运维、故障告警
3、需要统一管理和追踪各个服务节点定时任务的运行情况,以及任务属性信息,例如任务所属服务、所属责任人
因此,XXL-JOB应运而生: XXL-JOB是一个开源的轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展、开箱即用,其中“XXL”是主要作者,大众点评许雪里名字的缩写
自2015年开源以来,已接入数百家公司的线上产品线,接入场景涉及电商业务,O2O业务和大数据作业等(官方文档中可查看众多使用xxl-job的公司)
xxl-job是一个开源的任务调度平台,很多公司在使用时,会增加或修改自己的内部版本,所以你学到的教程与实际使用可能有一些差异,但是基本流程、结构上都是相同的
Xxl-job执行原理
最近更新的xxl-job官方版本注意点:
第一:多集群服务器,如何让定时任务只执行一次
答案:使用调度中心,来管理触发器(corn也就是表达式),触发器的数据,执行器的数据,任务数据等放在db数据库中
第二:@JobHandler注解被@XxlJob替换掉了
@JobHandler 只能作用在类上,切该类还要实现某一个类
@XxlJob 针对的是方法
一、xxl-job的下载安装
1.1去xxl-job官网或GitHub拿到项目之后,运行项目中的db下的数据库文件tables_xxl_job.sql,初始化数据库,建立表信息,持久化配置
- 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:系统用户表;
1.2 配置文件
打开xxl-job-admin模块,在application.properties中进行后台的配置(官网上拿的模板)
### 调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致,注意在数据库地址哪里加上时区属性,否则乱码spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job" />
如果已经正确进行上述配置,可将项目编译打包部署。
调度中心访问地址:http://localhost:8080/xxl-job-admin (该地址执行器将会使用到,作为回调地址),默认登录账号 “admin/123456”, 登录后运行界面如下图所示。
二、调度中心添加执行器
这一步你可以先把客户端(就是你写的代码,也就是具体执行的接口或者说执行器)先写好,再来调度中心配置执行器也可以
点击新增执行器
客户端编写执行器代码
1、在项目中引入xxl-job-core的依赖包
2、在配置文件中配置执行器的地址,此地址不是整个项目运行的地址,比如Tomcat配置8080,那么执行器可以配置9999,别的端口号
如下图
官网的配置模板:
### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin### 执行器通讯TOKEN [选填]:非空时启用;xxl.job.accessToken=### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册xxl.job.executor.appname=xxl-job-executor-sample### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。xxl.job.executor.address=### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";xxl.job.executor.ip=### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;xxl.job.executor.port=9999### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;xxl.job.executor.logretentiondays=30
3、写一个执行器,新建一个类(我使用Bean模式开发,也可以去官网看继承IJobHandler的那一种方式)
Bean模式任务,支持基于方法的开发方式,每个任务对应一个方法。
优点:
每个任务只需要开发一个方法,并添加”@XxlJob”注解即可,更加方便、快速。
支持自动扫描任务并注入到执行器容器。
1、任务开发:在Spring Bean实例中,开发Job方法;2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志;4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果;
// 可参考Sample示例执行器中的 "com.xxl.job.executor.service.jobhandler.SampleXxlJob" ,如下:@XxlJob("demoJobHandler")public void demoJobHandler() throws Exception {XxlJobHelper.log("XXL-JOB, Hello World.");}
在执行器里,写你要固定时间执行,或者每隔一段时间执行的任务内容
启动服务,调度中心那边新增任务,就可以开始执行任务了
四、调度中心任务管理里,新增任务
点击确认,就可以看到代码在执行了
可以在任务管理,执行或者暂停任务
xxl-job的使用介绍完毕,想更细致了解,建议去官方文档看
下一篇 介绍原理与负载均衡策略