XXL-JOB分布式任务调度框架详解(全网最详细!!!)

                        ​​​​​​​   引言

第一部分:XXL-JOB概述

第二部分:架构与组件

第三部分:使用教程

第四部分:源码分析

第五部分:最佳实践


引言

在分布式系统中,任务调度是一项基础而又关键的服务,它涉及到定时任务的管理和执行、负载均衡、容错处理等多个方面。XXL-JOB正是这样一款轻量级、高效且易于使用的分布式任务调度框架,它由大众点评的许雪里(XXL)开源,旨在解决分布式环境下定时任务的执行难题。本教案将从XXL-JOB的起源、架构设计、核心功能、使用教程、源码解析、最佳实践以及典型应用场景进行全面深入的讲解,帮助开发者理解和掌握XXL-JOB的精髓。

第一部分:XXL-JOB概述

1.1 起源与发展

XXL-JOB起源于大众点评内部的分布式任务调度需求,自2016年起开始接入线上产品线,至今已迭代数十个版本,广泛应用于互联网、金融、教育、物流等多个行业。其核心设计目标是“开发迅速、学习简单、轻量级、易扩展”,并且提供开箱即用的体验。

1.2 核心设计理念

XXL-JOB通过将调度行为与任务执行解耦的设计思想,形成了两个核心组件:调度中心执行器。调度中心负责任务的调度策略、触发时机及调度请求的发起,而执行器则负责接收调度请求并执行具体的任务逻辑。

第二部分:架构与组件

2.1 架构图解析

  • 调度中心:作为大脑,维护调度信息(任务信息、执行器信息等),并按照预设策略触发任务调度请求。
  • 执行器:作为手脚,部署在业务服务器上,负责接收调度中心的任务调度请求并执行任务,执行完毕后将执行结果返回给调度中心。
  • 数据库:存储任务配置、执行日志、调度记录等数据,保证调度中心与执行器之间的信息同步。

2.2 核心组件功能

  • 任务管理:通过Web界面进行任务的增删改查操作,支持多种调度类型(cron、固定频率、手动触发等)。
  • 执行器管理:管理执行器节点,包括注册、心跳检测、负载均衡等功能。
  • 日志管理:记录任务执行日志,便于问题排查和审计。
  • 报警策略:支持任务执行失败后的邮件、短信等报警通知。
第三部分:使用教程

3.1 快速入门

环境准备:Java开发环境、Maven、MySQL数据库。

<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>1.8.2</version>
</dependency>

下载与安装:从GitHub上下载XXL-JOB源码,解压后分别启动调度中心与执行器。

https://github.com/xuxueli/xxl-job 

数据库初始化:执行提供的SQL脚本,创建必要的数据库表。

请下载项目源码并解压,获取 “调度数据库初始化SQL脚本” 并执行即可。

位置:/xxl-job/doc/db/tables_xxl_job.sql 共8张表

xxl_job_lock:任务调度锁表;
xxl_job_group:执行器信息表,维护任务执行器信息;
xxl_job_info:调度扩展信息表:用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
xxl_job_log:调度日志表:用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
xxl_job_log_report:调度日志报表:用户存储XXL-JOB任务调度日志的报表,调度中心报表功能页面会用到;
xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;
xxl_job_user:系统用户表;

配置调度中心与执行器:通过application.properties文件配置数据库连接、执行器地址等。

### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 执行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-demo
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=30

创建任务:登录Web界面,添加任务,配置任务执行逻辑、触发策略等。

调度中心访问地址:http://localhost:8080/xxl-job-admin (该地址执行器将会使用到,作为回调地址)

用户名和密码:admin/123456


至此“调度中心”项目已经部署成功。

3.2 进阶配置

  • 分布式部署:多节点部署调度中心,实现高可用。
  • 执行器集群:部署多个执行器实例,实现任务的负载均衡与故障转移。
  • 自定义JobHandler:编写自定义任务处理器,实现业务逻辑。
第四部分:源码分析

4.1 核心模块

  • xxl-job-admin:调度中心模块,包含Web管理界面、调度逻辑等。
  • xxl-job-core:核心模块,包含任务调度模型、执行器与调度中心通信协议等。
  • xxl-job-executor-samples:执行器示例模块,包含多种框架下的执行器实现。

4.2 关键技术点

  • 任务调度算法:分析XXL-JOB如何实现高效的任务调度算法,包括时间轮、延迟队列等。
  • 通讯机制:深入理解HTTP长轮询、MQ等通讯方式在XXL-JOB中的应用。
  • 容错与重试:分析XXL-JOB的失败重试策略、故障转移机制。
第五部分:最佳实践

搭建springboot项目(执行器)

新建项目:在test模块下新建xxl-job-demo子模块

(1)pom文件

 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--xxl-job--><dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.3.0</version></dependency></dependencies>

(2)配置application.yml

# web port
server.port=8881
# no web
#spring.main.web-environment=false# log config
logging.config=classpath:logback.xml### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin### xxl-job, access token
xxl.job.accessToken=default_token### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-test
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=9999
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30

检查执行器中appname是否为:xxl_job_sharding_sample

(3)引导类:

package com.xxl.job;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class XxlJobApplication {public static void main(String[] args) {SpringApplication.run(XxlJobApplication.class,args);}
}

(4)添加xxl-job配置

添加配置类:

这个类主要是创建了任务执行器,参考官方案例编写,无须改动

package com.xxl.job.config;import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** xxl-job config*/
@Configuration
public class XxlJobConfig {private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);@Value("${xxl.job.admin.addresses}")private String adminAddresses;@Value("${xxl.job.accessToken}")private String accessToken;@Value("${xxl.job.executor.appname}")private String appname;@Value("${xxl.job.executor.address}")private String address;@Value("${xxl.job.executor.ip}")private String ip;@Value("${xxl.job.executor.port}")private int port;@Value("${xxl.job.executor.logpath}")private String logPath;@Value("${xxl.job.executor.logretentiondays}")private int logRetentionDays;@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appname);xxlJobSpringExecutor.setAddress(address);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}
}

 (5)创建任务

package com.xxl.job.config;import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;@Component
public class HelloJob {@Value("${server.port}")private String port;@XxlJob("demoJobHandler")public ReturnT helloJob() {System.out.println("简单任务执行了。。。。" + port);return  ReturnT.SUCCESS;}
}

@XxlJob(“demoJobHandler”)这个一定要与调度中心新建任务的JobHandler的值保持一致!

 配置执行器

在任务调度中心,点击进入"执行器管理"界面, 如下图:

1、此处的AppName,会在创建任务时被选择,每个任务必然要选择一个执行器。

2、“执行器列表” 中显示在线的执行器列表, 支持编辑删除。

以下是执行器的属性说明:
AppName  :是每个执行器集群的唯一标示AppName, 执行器会周期性以AppName为对象进行自动注册:可通过该配置自动发现注册成功的执行器, 供任务调度时使用;
名称 : 执行器的名称, 因为AppName限制字母数字等组成,可读性不强, 名称为了提高执行器的可读性;
排序 : 执行器的排序, 系统中需要执行器的地方,如任务新增, 将会按照该排序读取可用的执行器列表;
注册方式  :调度中心获取执行器地址的方式;
机器地址  :注册方式为"手动录入"时有效,支持人工维护执行器的地址信息;

具体操作:

(1)新增执行器: xxl-job-executor-test

(2)在调度中心新建任务
在任务管理->新建,填写以下内容

测试

(1)首先启动调度中心,xxl-job-admin

(2)启动xxl-job-demo项目

(3)启动任务:任务调度中心

(4)打开idea控制台,查看任务执行情况:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/844417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java设计模式:享元模式实现高效对象共享与内存优化(十一)

码到三十五 &#xff1a; 个人主页 目录 一、引言二、享元设计模式的概念1. 对象状态的划分2. 共享机制 三、享元设计模式的组成四、享元设计模式的工作原理五、享元模式的使用六、享元设计模式的优点和适用场景结语 [参见]&#xff1a; Java设计模式&#xff1a;核心概述&…

拼接字符串

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 使用“”运算符可完成对多个字符串的拼接&#xff0c;“”运算符可以连接多个字符串并产生一个字符串对象。 例如&#xff0c;定义两个字符串&#…

任务3.1:采用面向对象方式求三角形面积

面向对象编程&#xff08;OOP&#xff09;是一种将现实世界中的实体抽象为对象&#xff0c;并通过类和对象来模拟现实世界中的行为和属性的编程范式。在本实战任务中&#xff0c;我们通过创建一个Triangle类来模拟现实世界中的三角形&#xff0c;并使用面向对象的方法来求解三角…

「清新题精讲」CF249D - Donkey and Stars

更好的阅读体验 CF249D - Donkey and Stars Description 给定 n n n 个点 ( x i , y i ) (x_i,y_i) (xi​,yi​) 和 a , b , c , d a,b,c,d a,b,c,d&#xff0c;求出最多有多少个点依次连接而成的折线上线段的斜率在 ( a b , c d ) (\frac{a}{b},\frac{c}{d}) (ba​,dc​…

【智能算法】波搜索算法(WSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;H Zhang受到雷达技术启发&#xff0c;提出了波搜索算法&#xff08;Wave Search Algorithm, WSA&#xff09;。 2.算法原理 2.1算法思想 WSA模拟雷达工作时的发射、反…

opencascade 笔记

opencascade 画一个无限大的面 在 OpenCascade 中&#xff0c;要绘制一个无限大的面&#xff0c;你可以使用 gp_Pln 类来定义一个平面&#xff0c;然后将其绘制出来。这里是一个示例代码&#xff0c;演示如何在 OpenCascade 中绘制一个无限大的平面&#xff1a; #include <…

Hudi之数据读写探究

Hudi之数据读写深入探究 1. Hudi数据写入 1-1. 写操作 Hudi数据湖中的数据更新、插入和删除操作&#xff0c;是一个基于Apache Hadoop的库&#xff0c;为数据湖提供了一种有效的方法来处理更新和增量数据&#xff0c;并支持基于时间的快照和增量数据处理。Hudi支持三种主要的…

博物馆三维实景vr展示

VR技术应用到地产行业的优势不言而喻&#xff0c;随着购房政策的进一步放宽&#xff0c;购房刚需者借助VR商铺样板间展示系统看房&#xff0c;远比之前跑楼盘更便捷高效。那么VR商铺全景展示具体有哪些好处呢? VR技术与商铺的结合&#xff0c;为客户带来了前所未有的购房体验。…

Thingsboard规则链:Calculate Delta节点详解

在物联网(IoT)应用中&#xff0c;对设备数据的实时分析和处理是优化运营、预测维护的关键。Thingsboard作为一款功能强大的物联网平台&#xff0c;其规则引擎提供了丰富的节点来处理和分析数据流。其中&#xff0c;Calculate Delta节点是一个重要的工具&#xff0c;用于计算连续…

2024年西安交通大学程序设计校赛(ABCDEFO)

题目链接&#xff1a;https://vjudge.net/contest/630537#overview 文章目录 A题题意思路编程 B题题意思路编程 C题题意思路编程 D题题意思路编程 E题题意思路编程 F题题意思路编程 O题题意思路编程 写在前面&#xff1a;今天的训练赛出的题目偏简单&#xff0c;与XCPC的难度差…

C语言-----指针数组 \ 数组指针

一 指针数组 用来存放指针的数组 int arr[10]; //整型数组 char ch[5]; //字符数组 int * arr[6]; //存放整型指针的数组 char * arr[5]; //存放字符指针的数组 // 指针数组的应用 int main() {int arr1[] { 1,2,3,4,5 };int arr2[] { 2,3,4,5,6 };int arr3[] { 3,4,…

滴滴一季度营收同比增长14.9%至491亿元 经调整EBITA盈利9亿元

【头部财经】5月29日&#xff0c;滴滴在其官网发布2024年一季度业绩报告。一季度滴滴实现总收入491亿元&#xff0c;同比增长14.9%&#xff1b;经调整EBITA&#xff08;非公认会计准则口径&#xff09;盈利9亿元。其中&#xff0c;中国出行一季度实现收入445亿元&#xff0c;同…

第一课、Power BI 集成Python

1&#xff0c;下载安装python Python软件地址&#xff1a;Welcome to Python.org 双击自定义安装指定位置并勾选配置环境变量。 后续一直往下&#xff0c;安装完成。 检验是否成功&#xff0c;在cmd命令窗口下输入python 即可看到版本。 安装 pip install pandas 和 pip…

深入解析 JSONPath:从入门到精通

码到三十五 &#xff1a; 个人主页 在数据处理和交换领域&#xff0c;JSON已经成为了一种广泛使用的数据格式&#xff0c; 如何有效地查询和操作这些数据也变得越来越重要。在这种情况下&#xff0c;JSONPath 应运而生&#xff0c;成为了一种在JSON数据中定位和提取信息的强大工…

nginx学习记录-防盗链

1. 防盗链的概念 防盗链&#xff0c;顾名思义就是防止盗取链接&#xff0c;这里的链接一般是资源链接。 如图所示&#xff0c;我们访问一个网站时&#xff08;比如百度&#xff09;&#xff0c;我们第一个请求会获得一个html页面&#xff0c;页面中包含各种资源链接&#xff0…

产品经理-原型绘制(五)

1. 概念 用线条、图形描绘出的产品框架&#xff0c;也称为线框图&#xff0c;是需求和功能的具体化表现 2. 常用工具 Axure 3. 类别 3.1 草图原型 手绘图稿&#xff0c;修改方便&#xff0c;规划的早期使用 3.2 低保真原型 简单交互&#xff0c;无设计图&#xff0c;无需…

SOLIDWORKS正版软件购买指南

在这个数字化的时代,SOLIDWORKS作为一种卓悦的三维计算机辅助设计&#xff08;CAD&#xff09;工具&#xff0c;赢得了众多设计师和工程领域专家的喜爱。为了帮大家更加快捷方便地掌握这一知名设计工具&#xff0c;本文写了更全面的SOLIDWORKS选购指导&#xff0c;向大家披露选…

【Python】解决Python报错:SyntaxError: invalid character in identifier

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

[Linux系统编程] 静态库与动态库

一.库的概念 库是写好的现有的&#xff0c;成熟的&#xff0c;可以复用的代码。 本质上来说库是一种可执行代码的二进制形式&#xff0c;可以被操作系统载入内存执行。库有两种&#xff1a;静态库&#xff08;.a、.lib&#xff09;和动态库&#xff08;.so、.dll&#xff09;。…

继承--5.29

继承格式&#xff1a; package javatest2;public class people {int age;double workday;public people(int age, double workday) {this.age age;this.workday workday;} }package javatest2;public class student extends people {int studyday;public student(int age, d…