【xxl-job总结】

文章目录

  • xxl-job介绍
  • 系统组成
  • 为什么不使用quartz
  • 过期处理策略
  • 避免任务重复执行
  • 源码分析

xxl-job介绍

XXL-JOB是一个轻量级分布式任务调度平台,它的核心设计目标是开发迅速、学习简单、轻量级、易扩展。
1.简单易用:XXL-JOB提供了友好的Web界面,使得用户可以通过简单的操作完成任务的创建、编辑、删除和查询。
2.动态管理:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效。
3.调度中心高可用(HA):调度采用中心式设计,支持集群部署,可保证调度中心的高可用性。
4.执行器高可用(HA):任务分布式执行,执行器支持集群部署,可保证任务执行的高可用性。
5.注册中心:执行器会周期性自动注册任务,调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址。
6.弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务。
7.路由策略:执行器集群部署时提供丰富的路由策略,包括第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等。
8.故障转移:任务路由策略选择"故障转移"情况下,如果执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度请求。
9.执行失败查看日志:执行失败的任务可以查看日志。
10.支持邮件报警:XXL-JOB支持邮件报警,可以在任务执行失败时发送邮件通知。
11.跨平台任务调度:支持通过通用HTTP提供跨平台任务调度。
12.任务级联编排:支持父任务执行结束后触发子任务执行。
13.设置任务优先级:支持设置指定任务执行节点路由策略,包括多种调度策略。

系统组成

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

为什么不使用quartz

Quartz作为开源作业调度中的佼佼者,是作业调度的首选。但是集群环境中Quartz采用API的方式对任务进行管理,从而可以避免上述问题,但是同样存在以下问题:
问题一:调用API的的方式操作任务,不人性化;
问题二:需要持久化业务QuartzJobBean到底层数据表中,系统侵入性相当严重。
问题三:调度逻辑和QuartzJobBean耦合在同一个项目中,这将导致一个问题,在调度任务数量逐渐增多,同时调度任务逻辑逐渐加重的情况下,此时调度系统的性能将大大受限于业务;
问题四:quartz底层以“抢占式”获取DB锁并由抢占成功节点负责运行任务,会导致节点负载悬殊非常大;而XXL-JOB通过执行器实现“协同分配式”运行任务,充分发挥集群优势,负载各节点均衡。
XXL-JOB弥补了quartz的上述不足之处。

过期处理策略

任务调度错过触发时间时的处理策略:
可能原因:服务重启;调度线程被阻塞,线程被耗尽;上次调度持续阻塞,下次调度被错过;
处理策略:
过期超5s:本次忽略,当前时间开始计算下次触发时间
过期5s内:立即触发一次,当前时间开始计算下次触发时间

避免任务重复执行

调度密集或者耗时任务可能会导致任务阻塞,集群情况下调度组件小概率情况下会重复触发;
针对上述情况,可以通过结合 “单机路由策略(如:第一台、一致性哈希)” + “阻塞策略(如:单机串行、丢弃后续调度)” 来规避,最终避免任务重复执行。

源码分析

定时任务的核心入口

package com.xxl.job.admin.core.conf;import com.xxl.job.admin.core.alarm.JobAlarmer;
import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
import com.xxl.job.admin.dao.*;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.Arrays;/*** xxl-job config** @author xuxueli 2017-04-28*/@Component
public class XxlJobAdminConfig implements InitializingBean, DisposableBean {private static XxlJobAdminConfig adminConfig = null;public static XxlJobAdminConfig getAdminConfig() {return adminConfig;}// ---------------------- XxlJobScheduler ----------------------private XxlJobScheduler xxlJobScheduler;@Overridepublic void afterPropertiesSet() throws Exception {adminConfig = this;//核心  项目启动时,执行init中的方法xxlJobScheduler = new XxlJobScheduler();xxlJobScheduler.init();}@Overridepublic void destroy() throws Exception {xxlJobScheduler.destroy();}// ---------------------- XxlJobScheduler ----------------------// conf@Value("${xxl.job.i18n}")private String i18n;@Value("${xxl.job.accessToken}")private String accessToken;@Value("${spring.mail.username}")private String emailUserName;@Value("${xxl.job.triggerpool.fast.max}")private int triggerPoolFastMax;@Value("${xxl.job.triggerpool.slow.max}")private int triggerPoolSlowMax;@Value("${xxl.job.logretentiondays}")private int logretentiondays;// dao, service@Resourceprivate XxlJobLogDao xxlJobLogDao;@Resourceprivate XxlJobInfoDao xxlJobInfoDao;@Resourceprivate XxlJobRegistryDao xxlJobRegistryDao;@Resourceprivate XxlJobGroupDao xxlJobGroupDao;@Resourceprivate XxlJobLogReportDao xxlJobLogReportDao;@Resourceprivate JavaMailSender mailSender;@Resourceprivate DataSource dataSource;@Resourceprivate JobAlarmer jobAlarmer;public String getI18n() {if (!Arrays.asList("zh_CN", "zh_TC", "en").contains(i18n)) {return "zh_CN";}return i18n;}public String getAccessToken() {return accessToken;}public String getEmailUserName() {return emailUserName;}public int getTriggerPoolFastMax() {if (triggerPoolFastMax < 200) {return 200;}return triggerPoolFastMax;}public int getTriggerPoolSlowMax() {if (triggerPoolSlowMax < 100) {return 100;}return triggerPoolSlowMax;}public int getLogretentiondays() {if (logretentiondays < 7) {return -1;  // Limit greater than or equal to 7, otherwise close}return logretentiondays;}public XxlJobLogDao getXxlJobLogDao() {return xxlJobLogDao;}public XxlJobInfoDao getXxlJobInfoDao() {return xxlJobInfoDao;}public XxlJobRegistryDao getXxlJobRegistryDao() {return xxlJobRegistryDao;}public XxlJobGroupDao getXxlJobGroupDao() {return xxlJobGroupDao;}public XxlJobLogReportDao getXxlJobLogReportDao() {return xxlJobLogReportDao;}public JavaMailSender getMailSender() {return mailSender;}public DataSource getDataSource() {return dataSource;}public JobAlarmer getJobAlarmer() {return jobAlarmer;}}

init方法

public class XxlJobScheduler  {private static final Logger logger = LoggerFactory.getLogger(XxlJobScheduler.class);public void init() throws Exception {// init i18n 国际化initI18n();// admin registry monitor run//注册监控线程JobRegistryMonitorHelper.getInstance().start();// admin fail-monitor run//注册失败监控线程JobFailMonitorHelper.getInstance().start();// admin lose-monitor run//用于监控和处理“丢失”的任务。这些所谓的“丢失”任务可能是指那些由于执行器(Executor)宕机、网络分区或其他异常情况导致未能成功回调调度中心(Admin)的任务。JobLosedMonitorHelper.getInstance().start();// admin trigger pool start//启动任务触发的线程池JobTriggerPoolHelper.toStart();// admin log report start//启动日志报表任务JobLogReportHelper.getInstance().start();// start-schedule//开启任务调度线程JobScheduleHelper.getInstance().start();//调度器执行成功logger.info(">>>>>>>>> init xxl-job admin success.");}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

19. 架构重要需求

文章目录 第19章 架构重要需求19.1 从需求文档中收集架构重要需求&#xff08;ASRs&#xff09;不要抱太大希望从需求文档中找出架构重要需求 19.2 通过访谈利益相关者收集架构重要需求19.3 通过理解业务目标收集架构重要需求19.4 在效用树中捕获架构重要需求19.5 变化总会发生…

简易CPU设计入门:译码模块(一)

项目代码下载 还是请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&#xff…

Hunyuan-Large:腾讯发布业界参数规模最大的开源 MoE 模型,支持超长文本输入,超越主流开源模型

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…

Linux基础

1. openssl passwd -1 密码 128位 openssl passwd -5 密码&#xff08;更安全&#xff09;256位 openssl是开源的加密工具包&#xff0c;有各种加密&#xff0c;解密等功能 2. 文件管理 创建空文件 touch newfile 删除文件 rm new file 新建日录 mkdir newdir 删除…

HuggingFace情感分析任务微调

官方教程地址&#xff1a;https://huggingface.co/learn/nlp-course/zh-CN/chapter3/1?fwpt 部分内容参考&#xff1a; 李福林, & 计算机技术. (2023). HuggingFace 自然语言处理详解: 基于 BERT 中文模型的任务实战. 清华大学出版社. HuggingFace将AI项目研发分为四个步骤…

Springboot——对接支付宝实现扫码支付

文章目录 前言官方文档以及说明1、申请沙箱2、进入沙箱获取对应的关键信息3、拿到系统生成的公钥和密钥 注意事项创建springboot项目1、引入依赖2、配置连接参数3、创建配置类&#xff0c;用于接收这些参数4、中间类的定义(订单类)5、编写测试接口场景一、pc端请求后端后&#…

迪杰斯特拉算法

迪杰斯特拉算法 LeetCode 743. 网络延迟时间 https://blog.csdn.net/xiaoxi_hahaha/article/details/110257368 import sysdef dijkstra(graph, source):"""dijkstra算法:param graph: 邻接矩阵:param source: 出发点&#xff0c;源点:return:""&…

STL学习-容器适配器

一.stack栈 1.栈的介绍 stack 栈是一种只在一端(栈顶)进行数据插入(入栈)和删除(出栈)的数据结构,它满足后进 先出(LIFO)的特性。 使用push(入栈)将数据放入stack,使用pop(出栈)将元素从容器中移除。 栈的结构如图&#xff1a; 在头文件<stack>中&#xff0c;class st…

【C语言】动态内存开辟

写在前面 C语言中有不少开辟空间的办法&#xff0c;但是在堆上开辟的方法也就只有动态内存开辟&#xff0c;其访问特性与数组相似&#xff0c;但最大区别是数组是开辟在栈上&#xff0c;而动态内存开辟是开辟在堆上的。这篇笔记就让不才娓娓道来。 PS:本篇没有目录实在抱歉CSD…

海的记忆:海滨学院班级回忆录项目

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

【VScode】C/C++多文件夹下、多文件引用、分别编译——仅一个设置【适合新人入手】

【VScode】C/C多文件夹内的多文件引用编译 1、问题2、前提&#xff08;最简环境&#xff09;3、核心&#xff08;关键配置&#xff09;4、成功享用~ 1、问题 在使用 VScode 编写一个简单项目的时候&#xff0c;没有特别配置的情况下&#xff0c;若主文件(.c)引用了自定义的头文…

62 mysql 中 存储引擎MyISAM 中索引的使用

前言 固定数据表 mysql. tables_priv 的表结构创建如下 CREATE TABLE tables_priv (Host char(60) COLLATE utf8_bin NOT NULL DEFAULT ,Db char(64) COLLATE utf8_bin NOT NULL DEFAULT ,User char(32) COLLATE utf8_bin NOT NULL DEFAULT ,Table_name char(64) COLLATE u…

使用buildx构建多架构平台镜像

1. 查看buildx插件信息 比较新的docker-ce版本默认已经集成了buildx插件 [rootdocker ~]# docker buildx version github.com/docker/buildx v0.11.2 9872040 [rootdocker ~]#2. 增加多平台镜像构建支持 通过tonistiigi/binfmt:latest初始化一个基于容器的构建环境&#xff…

数据库基础(3) . Navicat使用

0.下载安装 官网 : https://www.navicat.com.cn/ Navicat 中国 | 支持 MySQL、Redis、MariaDB、MongoDB、SQL Server、SQLite、Oracle 和 PostgreSQL 的数据库管理 1.连接数据库 1.1.连接 1.1.1.点击连接 打开navicat 点击 左上角连接 1.1.2.选择MySQL 弹出配置界面 1.1…

MySQL(上)

一、SQL优化 1、如何定位及优化SQL语句的性能问题&#xff1f;创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因&#xff1f; 对于性能比较低的sql语句定位&#xff0c;最重要的也是最有效的方法其实还是看sql的执行计划&#xff0c;而对于mysql来说&a…

国密SM2 非对称加解密前后端工具

1.依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.21</version></dependency><dependency><groupId>org.bouncycastle</groupId><artifactId>bcpki…

【银河麒麟操作系统】软raid重建速度限制问题分析

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 遇到软raid重建速度问题&#xff0c;分…

ssm教室信息管理系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 …

去中心化存储:Web3中的数据安全新标准

随着Web3的兴起&#xff0c;去中心化存储逐渐成为数据安全的新标准。传统的中心化存储方式将数据集中保存在少数服务器上&#xff0c;这种模式尽管在早期互联网中被广泛应用&#xff0c;但随着数据量和数据价值的增加&#xff0c;其潜在的安全风险和隐私问题也逐渐暴露。而去中…

Ubuntu 22 安装 Apache Doris 3.0.3 笔记

Ubuntu 22 安装 Apache Doris 3.0.3 笔记 1. 环境准备 Doris 需要 Java 17 作为运行环境&#xff0c;所以首先需要安装 Java 17。 sudo apt-get install openjdk-17-jdk -y sudo update-alternatives --config java在安装 Java 17 后&#xff0c;可以通过 sudo update-alter…