就我了解的情况而言,分布式任务调度这一块,用XXL-Job或Elastic-Job的居多,都是国内开源软件的佼佼者。

Elastic-Job之前所在的公司就在用,本文就记录一下个人在学习搭建开发XXL-Job中的一些知识点。

基于最新版2.2.0。

部署

首先从GitHub上下载源码,并将工程导入IDE,如图:




docker调试 srs docker调度_hive 查看 job 日志


core是核心,admin是调度中心,剩下的是各种示例工程。

下载的文件中,找到tables_xxl_job.sql,导入MySQL数据库。


docker调试 srs docker调度_hive 查看 job 日志_02


docker调试 srs docker调度_hive 查看 job 日志_03


调度中心

打开xxl-job-admin工程resource目录下的application.properties,修改如下:


docker调试 srs docker调度_hive 查看 job 日志_04


在实际工作中,端口号、工程路径名、邮箱报警的相关配置按需修改。

JDBC要改。

打开logback.xml,配置日志路径:


docker调试 srs docker调度_docker调试 srs_05


日志显示的格式等配置按需修改。

至此,单机版调度中心配置完毕,接着就可以按照普通Spring Boot工程去编译部署了,XXL-Job也有官方的Docker镜像。

如果在实际工作中有高可用集群部署的要求,只需要保证DB配置一致,集群时钟一致,采用Nginx负载均衡,使用同一域名进行访问即可。

管理员用户名/密码:admin/123456

访问http://127.0.0.1:8080/xxl-job-admin,如图:


docker调试 srs docker调度_docker 搭建openzipkin_06


开发分布式任务

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修改:


docker调试 srs docker调度_hive 查看 job 日志_07


address是调度中心的地址,如果有多个用,隔开。

appname是配置给每个业务系统的,不可相同。

port是执行器的端口,调度中心会通过IP端口下发任务。

logpath是执行器内部代码输出的日志目录——这与后面logback.xml输出的日志有区别。

logretentiondays是日志保留的天数。

修改logback.xml如图:


docker调试 srs docker调度_docker 搭建openzipkin_08


修改日志路径,这里存放的是工程的运行日志,不保存执行器内部的日志。

至此,执行器工程配置完毕,开始代码开发。

执行器支持普通任务、分片任务、通用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一致。


docker调试 srs docker调度_docker 搭建openzipkin_09


配置任务:


docker调试 srs docker调度_docker 搭建openzipkin_10


调度模式有三种:无(适合一次性任务),CORN,周期性(每隔N秒执行一次)

配置完毕后,启动执行器工程,并在调度中心启动任务。

本文为了展示,不使用CORN模式,采用有参、无参两种启动模式,日志显示如下:


docker调试 srs docker调度_docker调试 srs_11


体会一下日志内容的区别。