XxlJob源码分析01:环境准备

关于定时任务,想必大家都不会陌生,简单的定时任务有jdk提供的定时任务、spring提供的定时任务,稍微复杂一些有quartz定时任务,分布式任务有xxl-jobelastic-job。由于项目中使用的定时任务是xxl-job,因此本系列将从源码的角度来分析xxl-job定时任务的设计与实现。

关于xxl-job的操作,xxl-job社区贴心地提供了操作文档:www.xuxueli.com/xxl-job/,文档不长,一遍看下来xxl-job的操作基本就会了,这块就不过多叙述了。

获取xxl-job源码

既然是源码分析,当然要先获取源码了,xxl-job的github地址为https://github.com/xuxueli/xxl-job。一般来说,直接frok这个仓库就可以了,不过由于国内网络的原因,github 的访问并不稳定,比如checkout到一半网络断开、push超时等。为了规避这些问题,建议使用国内的git仓库------gitee,操作方式如下:

1. 创建新的gitee仓库

登录个人的gitee,点击"+"号,选择"从github/gitlab导入仓库":

2. 导入xxl-job仓库

复制xxl-jobgithub地址,点击导入:

等待一会,就得到了自己的xxl-jobgitee地址了,本人得到的地址为https://gitee.com/funcy/xxl-job,并且gitee上也提供一个按钮,可以很方便地同步github上的代码:

如果有一天,你发现作者在github提交了大把代码,想及时同步到自己的gitee仓库,只要点击这个按钮就可以了,不过这样可能会覆盖自己的代码,可以通过新建分支来规避。

3. 创建新分支

接下来,就可以基于该仓库自由操作了,继续,选择一个自己准备放项目的目录,然后clone

bash 复制代码
git clone https://gitee.com/funcy/xxl-job

接下来,需要基于 tag 创建分支(新分支命为2.3.0.LEARN

css 复制代码
git tag
git checkout 2.3.0
git checkout -b 2.3.0.LEARN 2.3.0
git push -u origin 2.3.0.LEARN

后续我们所有的分析操作就都在2.3.0.LEARN上进行了。

关于创建分支一些小疑问:

  1. 为什么要创建新分支?

    主要是防止点击同步时,代码被覆盖。如果直接在master分支,或其他在github中已有的分支上进行修改,点击同步后,所作的修改都会被github上的分支覆盖,而在gitee上新建的分支则不会被覆盖

  2. 为什么要基于tag创建新分支而不是master

一般来说,master上的代码是最新稳定版本的代码,因此会不断变化,而tag上的代码,表示打tag那一刻的代码,之后不再变化,这样就保证了同一个tag上的代码,无论什么时候都是一样的。

事实上,了解了git的tag概念后,会发现tag上的代码checkout下来后,无法再怎么修改都不能提交,即不会被修改;相反地,master或其他分支,修改后可以再提交。由于tag上的代码是不变的,为了能提交代码,必须要基于tag上的代码创建新分支

  1. 为什么选择的tag版本是2.3.0而不是其他?

因为当前最新版的xxl-job2.3.0,当然要分析最新版的代码了。

xxl-job 项目结构

拿到代码后,我们来看下xxl-job的项目结构:

  • xxl-job-admin:管理后台,提供任务管理界面,同时也是任务的调度器、触发器,本系列文章中简称为admin
  • xxl-job-corexxl-job的核心组件,同时也是xxl-job对外提供的jar包,提供了任务执行相关逻辑。
  • xxl-job-executor-samples:执行器示例,在本系列文章中,执行器是指集成了xxl-job任务执行功能的项目,也称为executor
    • xxl-job-executor-sample-frameless:不集成任何框架的示例
    • xxl-job-executor-sample-springboot:集成了 springboot 框架的示例

关于该项目的更多细节,可以参考官方文档www.xuxueli.com/xxl-job/,这里截取官方的架构图:

建议先了解上图中xxl-job的组件,后面的源码分析会一步步揭开这些组件工作的原理。

启动xxl-job

大致了解xxl-job的结构后,接下来我们在idea中启动xxl-job,这样也是方便我们后面调试。

1. 执行sql脚本

xxl-job的sql脚本位于xxl-job/doc/db目录下,文件名为tables_xxl_job.sql

准备一个mysql数据库,直接执行该脚本即可。需要注意的是,如果数据库中已存在名为xxl_job数据库,执行该脚本会覆盖原来的库,需要注意下。

执行成功后,数据库中会出现如下表:

各表的功能如下:

  • xxl_job_user: 用户信息,用来验证登录到管理后台的用户是否合法
  • xxl_job_info: 任务信息表,用来配置需要执行的任务
  • xxl_job_log: 日志表,用来记录任务的执行日志
  • xxl_job_log_report: 任务执行报表,用来汇总、统计任务的执行情况
  • xxl_job_logglue: gule模式任务表,主要记录glue模式任务的执行代码
  • xxl_job_registry: 执行器的注册记录表,每一个执行器都保存一条注册记录
  • xxl_job_group: 执行器的注册汇总表,多个执行器汇总成一条记录
  • xxl_job_lock: 锁表,xxl-job用来实现分布式锁的表

2. 启动admin

admin的启动类为com.xxl.job.admin.XxlJobAdminApplication

不过在启动前,需要调整数据库的连接配置,配置文件为application.properties

将数据库的连接信息调整正确后,运行XxlJobAdminApplication就可以启动了,控制台日志如下:

在浏览中访问http://localhost:8080/xxl-job-admin/,界面如下:

管理后台的菜单不多,操作比较简单,大家可根据官方文档可行摸索。

3. 启动executor

xxl-job提供了两个执行器示例,考虑到当前开发基本上基于springboot,本系列将重点分析集成了springboot的执行器示例,即xxl-job-executor-sample-springboot

在启动xxl-job-executor-sample-springboot前,要先配置xxl-job-admin项目的地址,配置文件为application.properties:

配置key为xxl.job.admin.addresses,如果有多个xxl-job-admin地址,可以使用,分开。

配置好admin地址后,启动即可,启动类为com.xxl.job.executor.XxlJobExecutorApplication,控制台日志如下:

注意到这里有两个端口:

  • 8081:这个是 项目的web 服务提供的对外访问端口,用来访问 springmvc 接口的
  • 9999:这个是xxl-job用来与admin通讯的接口,用来处理xxl-job-admin发送过来的请求,这个后面我们再分析

4. 第一个定时任务

xxl-job本身也提供了示例任务:

任务在任务管理菜单下,后续我们配置自己的任务时,也是在这里配置。

从界面上可以看到,目前已经有了一个测试任务,不过状态为stop,我们可以在"操作"栏启动该任务,也可以使用"执行一次"功能来手动执行该任务,这里我们使用"执行一次"来运行该任务:

直接点击"保存"即可,之后可以在"调度日志"菜单查看任务执行情况:

可以看到任务执行成功了。

该任务的代码位于xxl-job-executor-sample-springboot模块的com.xxl.job.executor.service.jobhandler.SampleXxlJob#demoJobHandler方法,代码如下:

关于其中的调度原理,我们将在后面的文章中再分析。

总结

本文是xxl-job源码分析的开篇,介绍了源码分析前的准备工作,主要包含了三个方面:

  1. 源码的获取,介绍了如何从github上获取xxl-job源码,以及分支的创建流程
  2. 项目的启动,介绍了sql脚本的处理、admin注册地址的配置,以及项目的启动(adminexecutor
  3. 执行定时任务,介绍了如何执行xxl-job提供的任务示例,由于本系列文章以源码分析为主,因此任务的配置、cron表达式的意义等均无叙述,若要了解这些操作可以参考官方文档(www.xuxueli.com/xxl-job/)或者...%25E6%2588%2596%25E8%2580%2585%25E8%2587%25AA%25E8%25A1%258C%25E6%2590%259C%25E7%25B4%25A2%25E8%25B5%2584%25E6%25BA%2590%25E3%2580%2582 "https://www.xuxueli.com/xxl-job/)%E6%88%96%E8%80%85%E8%87%AA%E8%A1%8C%E6%90%9C%E7%B4%A2%E8%B5%84%E6%BA%90%E3%80%82")

作为源码分析的准备工作就到这里了,下-篇我们将正式进入xxl-job项目的源码分析中。


限于作者个人水平,文中难免有错误之处,欢迎指正!原创不易,商业转载请联系作者获得授权,非商业转载请注明出处。

相关推荐
the beard7 小时前
Feign整合Sentinel实现服务降级与Feign拦截器实战指南
java·spring·sentinel
THMAIL7 小时前
攻克 Java 分布式难题:并发模型优化与分布式事务处理实战指南
java·开发语言·分布式
小沈同学呀7 小时前
使用Java操作微软 Azure Blob Storage:上传和下载文件
java·microsoft·azure
CYRUS_STUDIO9 小时前
一步步带你移植 FART 到 Android 10,实现自动化脱壳
android·java·逆向
练习时长一年9 小时前
Spring代理的特点
java·前端·spring
CYRUS_STUDIO9 小时前
FART 主动调用组件深度解析:破解 ART 下函数抽取壳的终极武器
android·java·逆向
MisterZhang6669 小时前
Java使用apache.commons.math3的DBSCAN实现自动聚类
java·人工智能·机器学习·自然语言处理·nlp·聚类
Swift社区10 小时前
Java 常见异常系列:ClassNotFoundException 类找不到
java·开发语言
一只叫煤球的猫11 小时前
怎么这么多StringUtils——Apache、Spring、Hutool全面对比
java·后端·性能优化