就我了解的情况而言,分布式任务调度这一块,用XXL-Job或Elastic-Job的居多,都是国内开源软件的佼佼者。
Elastic-Job之前所在的公司就在用,本文就记录一下个人在学习搭建开发XXL-Job中的一些知识点。
基于最新版2.2.0。
部署
首先从GitHub上下载源码,并将工程导入IDE,如图:
core是核心,admin是调度中心,剩下的是各种示例工程。
下载的文件中,找到tables_xxl_job.sql,导入MySQL数据库。
调度中心
打开xxl-job-admin工程resource目录下的application.properties,修改如下:
在实际工作中,端口号、工程路径名、邮箱报警的相关配置按需修改。
JDBC要改。
打开logback.xml,配置日志路径:
日志显示的格式等配置按需修改。
至此,单机版调度中心配置完毕,接着就可以按照普通Spring Boot工程去编译部署了,XXL-Job也有官方的Docker镜像。
如果在实际工作中有高可用集群部署的要求,只需要保证DB配置一致,集群时钟一致,采用Nginx负载均衡,使用同一域名进行访问即可。
管理员用户名/密码:admin/123456
访问http://127.0.0.1:8080/xxl-job-admin,如图:
开发分布式任务
XXL-Job支持两种模式的任务开发,BEAN和GLUE。
GLUE是在WebIDE上进行开发,源码维护在调度中心,支持Java、Shell、Python、NodeJS、PHP、PowerShell。不过我感觉在实际工作中,这么做的很少吧。大家有在公司使用过这种模式进行开发的可以说一说。
更多的应该还是在业务系统中基于BEAN模式开发。
BEAN模式有两种方式:类形式、方法形式。
其中类型是就是继承IJobHandler,实现其中任务方法,并注入到执行器容器内即可。
一个任务一个类,无需框架,直接用main函数调用即可。不过实际工作中应该不会采用这种形式吧。
着重介绍的是基于Spring容器的开发,本文基于Spring Boot
打开xxl-job-executor-sample-springboot的resources目录下的application.properties修改:
address是调度中心的地址,如果有多个用,隔开。
appname是配置给每个业务系统的,不可相同。
port是执行器的端口,调度中心会通过IP端口下发任务。
logpath是执行器内部代码输出的日志目录——这与后面logback.xml输出的日志有区别。
logretentiondays是日志保留的天数。
修改logback.xml如图:
修改日志路径,这里存放的是工程的运行日志,不保存执行器内部的日志。
至此,执行器工程配置完毕,开始代码开发。
执行器支持普通任务、分片任务、通用HTTP任务、命令行任务的开发。在实际工作中,普通任务的开发应该是更为常见,以此为例。
@Componentpublic class StatisticsIncomeJob { private static Logger logger = LoggerFactory.getLogger(StatisticsIncomeJob.class); /** * 每天凌晨0点11分11秒,统计昨天的收入情况 * * @param param * @return * @throws Exception */ @XxlJob("statIncomeEveryDayJobHandler") public ReturnT statIncomeEveryDayJobHandler(String param) throws Exception { if(Strings.isNullOrEmpty(param)) { logger.info("A每日统计收入。参数为空"); XxlJobLogger.log("B每日统计收入。参数为空"); }else { logger.info("A每日统计收入。参数:"+param); XxlJobLogger.log("B每日统计收入。参数:"+param); } //业务代码 return ReturnT.SUCCESS; }}
在调度中心进行配置:
配置执行器,最重要的就是AppName,必须与执行器properties文件中的appname一致。
配置任务:
调度模式有三种:无(适合一次性任务),CORN,周期性(每隔N秒执行一次)
配置完毕后,启动执行器工程,并在调度中心启动任务。
本文为了展示,不使用CORN模式,采用有参、无参两种启动模式,日志显示如下:
体会一下日志内容的区别。