首页 > 其他分享 >19.任务调度之xxl-job原理

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

时间:2023-08-09 18:01:03浏览次数:41  
标签:执行器 Quartz 19 调度 job 任务 任务调度 xxl

课程目标
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原理分析

标签:执行器,Quartz,19,调度,job,任务,任务调度,xxl
From: https://www.cnblogs.com/yier-l/p/17617523.html

相关文章

  • xxljob配置及基本使用
    以byteeasy项目为例集成xxl-job两个开源项目git地址:[email protected]:xuxueli0323/[email protected]:hbuzc/byteeasy.git 1、导入数据库xxljob的doc文件下的db文件中包含sql文件,复制到navicat执行。2、部署xxl-job项目将打好的xxl-job项目jar包放到新文件夹下;......
  • 2023下半年产品经理NPDP认证8月19日正式开班,报名从速
    产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。  【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是全球范围内产品开发与管理专业人士最杰出的倡导者,协助个人、企业......
  • SQL SERVER 2019 数据库还原测试库的方法
    1、备份正式库数据2、在其它电脑上还原备份的数据库 不需要覆盖其它数据库,直接还原出数据库还原时修改文件名和数据库名称: 修改文件名称      还原成功......
  • POJ-3619 Speed Reading
    POJ-3619SpeedReading#include<iostream>usingnamespacestd;typedeflonglongll;#defineIOSios::sync_with_stdio(0);cin.tie(0);cout.tie(0);//#defineiosios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);constintN=1e6+10;......
  • [HarekazeCTF2019]baby_rop2
    [HarekazeCTF2019]baby_rop264位的ret2libc30x01利用printf泄露libc版本和基地址,传参的时候需要传入格式化字符串%s给寄存器rdi(程序中第二个printf函数自带,返回至该格式化字符串地址即可);并将想要泄露的read_got传给寄存器。0x02expfrompwnimport*fromLibcSearcherimp......
  • ciscn_2019_es_2
    ciscn_2019_es_20x0132位开NX,有system函数,但是需要传入binsh。然而,栈上变量s位于ebp-0x28,而read函数仅能读入0x30个字节,那么若想实施缓冲区溢出,只有0x08=0x30-0x28个字节供我们进行布局。因此,在只有ebp与ret能被篡改的条件下可尝试使用栈迁移。程序存在leaveret......
  • python3 apscheduler 任务池 异常错误 /opt/www/taskPools1/venv/lib/python3.8/site-
    报错信息:(venv)root@VM-8-7-ubuntu:/opt/www/taskPools1#pythonmain.pyTraceback(mostrecentcalllast):File"/opt/www/taskPools1/venv/lib/python3.8/site-packages/apscheduler/jobstores/mongodb.py",line86,inadd_jobself.collection.insert_on......
  • 12.Job和CronJob
    Job和CronJob编排作业级应用JobJob控制器的应用编排机制如果说daemoset和deployment主要负责编排始终运行的守护进程类应用;而Job则是负责编排运行有结束时间的“一次性”任务。◼控制器要确保Pod内的进程“正常(成功完成任务)”地退出◼非正常退出的Pod可以根据需要重启,......
  • Go的任务调度单元与并发编程
    摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言本文主要介绍Go语言、进程、线程、协程的出现背景原因以及Go语言如何解决协程的问题和并发编程的实现,本文的阅读时长约在15-20分钟......
  • [OGeek2019]babyrop
    [OGeek2019]babyrop0x0164位程序,开启NX没有system函数和/bin/sh字符串0x02分析程序:main函数中,先读取一个随机数到fd,并作为参数传入sub_804871F函数,再将sub_804871F函数的返回值作为参数传入sub_80487D0函数里。main函数sub_804871F函数sub_80487D0函数观察程序我们可......