当前位置: 首页 > article >正文

xxl-job详解

目录

  • 1、xxl-job介绍
    • 1.1 xxl-job的原理
      • 1.1.1 执行器的注册和发现
      • 1.1.2 调度中心调用执行器
    • 1.2 quartz和xxl-job对比
  • 2、快速入门
    • 2.1 下载并启动
    • 2.2 在调度中心新增定时任务
    • 2.3 任务运行模式(BEAN、GLUE)
    • 2.4 xxl-job的总结
  • 3、后端专属技术群

1、xxl-job介绍

​ xxl-job是一个分布式的任务调度平台,其核心设计目标是:学习简单、开发迅速、轻量级、易扩展,现在已经开放源代码并接入多家公司的线上产品线,开箱即用。xxl是xxl-job的开发者大众点评的许雪里名称的拼音开头。

​ xxl-job框架主要用于处理分布式的定时任务,其主要由调度中心和执行器组成。

  • 调度模块(调度中心):
    负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;
    支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。
  • 执行模块(执行器):
    负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;
    接收“调度中心”的执行请求、终止请求和日志请求等。
    总结:

​ 调度中心:统一管理任务调度平台上的调度任务,负责触发调度执行,并且提供任务管理平台。

​ 执行器:接收调度中心的调度并且执行,可以直接执行也可以集成到项目中。

每一个xxl-job微服务 = 独立的人(执行器)
每一个Handler = 餐桌上的食物
"可视化界面可以决定哪个人(执行器)吃或者不吃某个食物(定时任务)"

​ 调度中心和执行器两个模块分开部署,相互分离,两者之间通过RPC进行通信,其中调度中心主要是提供一个平台,管理调度信息,发送调度请求,自己不承担业务代码,而执行器接受调度中心的调度执行业务逻辑。
在这里插入图片描述

1.1 xxl-job的原理

1.1.1 执行器的注册和发现

执行器的注册和发现主要是关系两张表:

xxl_job_registry:执行器的实例表,保存实例信息和心跳信息,xxl_job_group:每个服务注册的实例列表。

执行器启动线程每隔30秒向注册表xxl_job_registry请求一次,更新执行器的心跳信息,调度中心启动线程每隔30秒检测一次xxl_job_registry,将超过90秒还没有收到心跳的实例信息从xxl_job_registry删除,并更新xxl_job_group服务的实例列表信息。

1.1.2 调度中心调用执行器

1、调度中心的操作:

调度中心通过循环不停的:

在这里插入图片描述

2、执行器的操作:

  • 执行器接收到调度中心的调度信息,将调度信息放到对应的任务的等待队列中
  • 执行器的任务处理线程从任务队列中取出调度信息,执行业务逻辑,将结果放入一个公共的等待队列中(每个任务都有一个单独的处理线程和等待队列,任务信息放入该队列中)
  • 执行器有一个专门的回调线程定时批量从结果队列中取出任务结果,并且回调告知调度中心

1.2 quartz和xxl-job对比

  • quartz采用api的方式调用任务,不方便,但是xxl-job使用的是管理界面。
  • quartz比xxl-job代码侵入更强
  • quartz调度逻辑和QuartzJobBean耦合在一个项目中,当任务增多,逻辑复杂的时候,性能会受到影响
  • quartz底层以抢占式获取db锁并且由抢占成功的节点运行,导致节点负载悬殊非常大;xxl-job通过执行器实现协同分配式运行任务,各个节点比较均衡。
    在这里插入图片描述

2、快速入门

2.1 下载并启动

首先从GitHub上面将项目clone下来,如果网络问题导致速度慢也可以从Gitee上面拉取

GitHub地址:https://github.com/xuxueli/xxl-job

Gitee地址:https://gitee.com/xuxueli0323/xxl-job

1、源码下载解压,用idea打开,结果如图:
在这里插入图片描述

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

2、初始化数据库,运行doc/db/tables_xxl_job.sql中的sql生成数据库和表,如图:
在这里插入图片描述

  数据库中表介绍:

  - xxl_job_group:执行器信息表,维护任务执行器信息;
  - xxl_job_info:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;

  - xxl_job_lock:任务调度锁表;

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

3 、打开xxl-job-admin模块,在application.properties中进行后台的配置,修改数据库信息
在这里插入图片描述
部署调度中心

在这里插入图片描述

调度中心访问地址:http://localhost:8080/xxl-job-admin ,默认登录账号 “admin/123456”, 登录后运行界面如下图所示。

在这里插入图片描述
4、执行器配置及部署
在这里插入图片描述
创建一个新的定时任务,定位到jobhandler下,新增定时任务
在这里插入图片描述

package com.xxl.job.executor.service.jobhandler;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;

import static com.xxl.job.core.biz.model.ReturnT.SUCCESS;

/**
 * @author zh
 * @description 编写自己的定时任务handler
 * @date 2023/12/8 14:55
 */

@Component
public class MyJobHandler {

    /**
     * 简单任务示例【bean模式】
     * @param param
     * @return
     */
    @XxlJob(value = "myJobHandler", init = "", destroy = "")
    public ReturnT<String> demoJobHandler(String param) throws InterruptedException {
        //模拟业务执行
        System.out.println("hello xxl-job..,");
        //返回执行结果
        return SUCCESS;
    }
}

2.2 在调度中心新增定时任务

1、选中右侧任务管理 - 新增
在这里插入图片描述
2、启动XxlJobExecutorApplication执行器
在这里插入图片描述
3、在调度中心,启动定时任务
在这里插入图片描述
4、查看结果
在这里插入图片描述

2.3 任务运行模式(BEAN、GLUE)

运行模式分为两种,一种是BEAN,一种是GLUE

BEAN模式:这个是在项目中写 Java 类,然后在 JobHandler 里填上 @XxlJob 里面的名字,是在执行器端编写的
GLUE模式:支持Java、Shell、Python、PHP、Nodejs、PowerShell,这个时候代码是直接维护在调度中心这边的

2.4 xxl-job的总结

​ xxl-job是一个中心式分布式的调度平台,调度中心和执行器解耦,执行器和业务代码耦合,代码的侵入性少,学习简单、开发简单、轻量级。

3、后端专属技术群

后端专属技术群
我建了一个后端专属技术群,欢迎从事编程开发、技术招聘HR进群,也欢迎大家分享自己公司的内推信息,相互帮助,一起进步!
文明发言,以交流技术、职位内推、行业探讨为主

图片

关注公众号,拉你进群

http://www.kler.cn/a/162672.html

相关文章:

  • 开源 2 + 1 链动模式、AI 智能名片、S2B2C 商城小程序在用户留存与品牌发展中的应用研究
  • linux 下查看程序启动的目录
  • 文件上传漏洞--理论
  • 问:MySQL主从同步的机制梳理?
  • mysql 快速解决死锁方式
  • JMeter基础篇
  • RestTemplate硬编码的使用
  • C++STL的string模拟实现
  • 实现SQL server数据库完整性
  • 进程控制与原语
  • Termux+Hexo结合内网穿透轻松实现安卓手机搭建博客网站发布公网访问
  • 这把养生局~
  • Vue 子路由页面发消息给主路由页面 ,实现主页面显示子页面的信息
  • [架构之路-258]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 架构设计 - 软件架构与软件框架的详细比较
  • 倒计时模块复习
  • 一篇文章带你快速入门 Vue 核心语法
  • chfs,简单好用的局域网共享网盘
  • 设计并实现一个多线程图书馆管理系统,涉及数据库操作
  • python圣诞树代码编程
  • HarmonyOS
  • JVM GUI可视化监控及诊断工具
  • Python语言基础知识(二)
  • 【S32DS报错】-2-提示Error while launching command:arm-none-eabi-gdb –version错误
  • DeepIn,UOS统信专业版安装运行Java,JavaFx程序
  • LeetCode-496. 下一个更大元素 I【栈 数组 哈希表 单调栈】
  • pip的常用命令