19.任务调度之xxl-job原理

发布时间 2023-08-09 17:56:56作者: 让你上瘾的三哥
课程目标
1、掌握xxl-job的部署、开发方法
2、掌握xxl-job的特性和架构设计
3、掌握xxl-job的运行原理

内容定位
适合已经掌握Quartz的同学学习。
Quartz这节课是大家必须去看的,因为E-job的底层就是Quartz, xxljob 最开始也是用Quartz实现的。

1.xxl-job基本介绍

1.1.Quartz体系结构

Quartz中最重要的三个对象: Job、Trigger、 Scheduler。

xxl-job的调度原理:调度线程在一个while循环中不断地获取一定数量的即将触发的Trigger,拿到绑定的Job,包装成工作线程执行。

当然,不管在任何调度系统中,底层都是线程模型。如果要自己写一个调度系统,一定要对多线程并发这一块有比较深入的学习,比如线程怎么启动怎么wait怎么notify怎么加锁等等。

1.2. Quartz 的不足

前面的课程我们讲过,Quartz 有差不多20年的历史,调度模型已经非常成熟了,而且很容易集成到Spring中去,用来执行业务任务是一个很好的选择。

但是还是会有一-些问题,比如:

  • 1、调度逻辑(Scheduler) 和任务类耦合在同一个项目中,随着调度任务数量逐渐增多,同时调度任务逻辑逐渐加重,调度系统的整体性能会受到很大的影响;
  • 2、Quartz 集群的节点之间负载结果是随机的,谁抢到了数据库锁就由谁去执行任务,这就有可能出现旱的旱死,涝的涝死的情况,发挥不了机器的性能。
  • 3、Quartz 本身没有提供动态调度和管理界面的功能,需要自己根据API进行开发。
  • 4、Quartz 的日志记录、数据统计、监控不是特别完善。

xxl-job和Elastic-Job都是对Quartz进行了封装,让我们用起来更简单,功能更强大。在是否需要重新造轮子这一-件事情上面,大家的看法是一致的。

1.3. xxl-job发展历史

源码地址: https://github.com/xuxueli/xxIljob

中文文档: https://www.xuxueli.com/xxl-job/

2015年开源,一个大众点评的程序员的业余之作。众所周知,大众点评因为被美团收购了,现在是美团点评。

xxI是作者名字许雪里的首字母简写,除了xxl-job之外,作者还开源了很多其他组件,现在一共有11个开源项目,组成了xxl家族。

到目前为止登记使用xxl-job的公司有几百家,算上那些没有登记的公司,实际上应该有几千家不止。

在xxl-job早期的版本中,直接使用了Quartz的调度模型,直到2019年7月7日发布的7.27版本才移除Quartz依赖。.

实际上即使重构代码移除了Quartz的依赖,xxIjob 中也到处是Quartz的影子。比如任务、调度器、触发器的三个维度设计,是非常经典的。

xxl-job弱化了触发器的概念,统一用 cron触发,获取任务的流程给Quartz是类似的。

最新发布版本是: 2.2.0。

1.4 xxl-job特性

跟老牌Quartz相比,xxl-job拥有更丰富的功能

总体上可以分成三类:
1、性能的提升:可以调度更多的任务。
2、可靠性的提升:任务超时、失败、故障转移的处理。
3、运维更加便捷:提供操作界面、有用户权限、详细的日志、提供通知配置、自动生成报表等等。

2. xxl-job快速上手

2.1 下载源码

2.1.1 release页面下载

注意不要直接clone最新的master代码(2.2.1-SNAPSHOT),master是正在开发的,从发布界面下载稳定版本(2.2.0)。

2.1.2 在IDEA中打开

  • /doc :文档资料,包括”调度数据库”建表脚本
  • /xxl-job-core :公共Jar依赖
  • /xxl-job-admin :调度中心,项目源码,Spring Boot工程,可以直接启动
  • /xxl-job-executor-samples :执行器,Sample 示例项目,其中的Spring Boot工程,可以直接启动。可以在该项目上进行开发,也可以将现有项目改造生成执行器项目。

2.2 始化数据库

数据库脚本在doc/db目录下:

生成8张表(本地创建xxl-job数据库)

表初始化好以后,就可以配置代码工程了。

这里我们先说一下总体概念。

admin和executor的项目可以单独复制出来(两个Spring Boot工程),修改一下pom文件。实际上开发、运行的时候肯定也是独立的工程。

这个执行器也不一定是单独运行的,可能会集成在业务项目里面(多启动一个端口),所以还有一个名字叫业务实例。

xxl-job的调度器和业务执行是独立的。调度器决定任务的调度,并且通过HTTP的方式调用执行器接口执行任务。

所以在这里我们需要先配置至少一个调度中心,运行起来,也可以集群部署。

然后再配置至少一个执行器,运行起来,同样可以集群部署。

启动顺序是先启动调度器,再启动执行器。

3.xxl-job任务详解

4.xxl-job架构设计

5.xxl-job原理分析