【任务调度框架】「分析技术指南」带你一同盘点一下常用的任务调度框架的方案和原理开发指南

news2024/12/29 10:55:07

带你一同盘点一下常用的任务调度框架的方案和开发指南

  • 任务调度
    • JDK原生任务调度
      • Java.Util — Timer(单线程)/ TimerTask(任务调度)
      • Java.Util.Concurrent — 任务调度线程池
    • Spring任务调度机制
    • Quartz任务调度机制
      • 简单的使用流程
        • Trigger触发器
        • Calendar时期组件
        • JobListener工作监听器
        • JobStore工作存储
        • 配置文件
        • 集群Cluster
        • 运行流程
    • XXL-JOB任务调度框架
      • 解决Quartz的不足
      • XXLJOB的特点分析
      • XXLJOB的模块
      • 执行器中任务阻塞的处理:
    • Elastic-JOB任务调度框架
      • ElasticJob的基本原理
      • ElasticJob的特点
      • ElasticJob的应用场景
      • ElasticJob的使用方法
      • ElasticJob的特点与其他调度框架的区别
    • 阿里的闭源任务调度— SchedulerX
      • SchedulerX的特点
      • SchedulerX的应用场景
      • SchedulerX的使用方法
    • 最后总结

任务调度

Java是一种广泛使用的编程语言,它提供了许多强大的工具和框架来帮助开发人员更好地管理和分配任务。其中,任务调度技术是Java中非常重要的一部分。在本文中,我们将介绍Java中的任务调度技术的基本原理、应用场景以及常见的任务调度工具。

对此本人整理了较为常用的任务调度框架或者服务的一个总览图,看看是否也有你们公司正在使用的?如下所示:
在这里插入图片描述

JDK原生任务调度

Java的原生的任务调的框架技术,主要有JUC和JU两个部分的实现基础底座。
在这里插入图片描述

Java.Util — Timer(单线程)/ TimerTask(任务调度)

JDK原生任务调度的原生任务调度框架主要是基于Java的定时器(Timer)和定时任务(ScheduledTask)机制。定时器是Java中用于执行定时任务的工具,它可以在指定的时间间隔内执行任务。定时任务是Java中用于执行周期性任务的工具,它可以在指定的时间间隔内重复执行任务。Java中的任务调度技术可以根据任务的优先级、资源的可用性和其他因素来决定任务的执行顺序和时间。

Java.Util.Concurrent — 任务调度线程池

我们都知道当线程执行的时间超过了调度间隔的时候,会存在问题和bug,因此Java又出台了另外一个任务调度组件ScheduledExecutorService(多线程)调度机制。

而我们常常使用的就是ScheduledThreadPoolExecutor,它实现了ScheduledExecutorService,它采用了阻塞队列(BlockedQueue)模式实现的延迟队列,越早执行的任务越在队头,从队头开始判断任务的执行时间是不是到了。

Spring任务调度机制

在这里插入图片描述
Spring Task是Spring框架中的一个任务调度工具,它可以与Spring框架无缝集成,提供了许多强大的功能,包括任务调度、任务执行、任务监控和任务管理等。

由于Spring对任务调度做了非常高度的封装,因此我们只需要使用@Scheduled就可以定义对应的任务调度任务,基于ScheduledThreadPoolExecutor。具体的实现方案,我就不在本节内容进行介绍和说明,后面会专门出文章进行详细分析和介绍。

Quartz任务调度机制

Java中的任务调度技术可以应用于各种类型的系统,包括Web应用程序、桌面应用程序和移动应用程序等。在Web应用程序中,任务调度技术可以用于管理后台任务、数据备份和数据清理等。在桌面应用程序中,任务调度技术可以用于管理自动更新和数据同步等。在移动应用程序中,任务调度技术可以用于管理后台任务和数据同步等。

除了上面介绍的Java中有许多常见的任务调度工具,其中最流行的是Quartz。Quartz是一个开源的任务调度框架,它提供了许多强大的功能,包括任务调度、任务执行、任务监控和任务管理等。
在这里插入图片描述
我们可以从以上几个内容对Quartz任务调度框架进行分析和介绍:

简单的使用流程

  • Quartz的门面是调度器-Scheduler,它根据Trigger(触发器)生成对应的JobDetail(作业)。
  • Trigger(触发器):代表和控制着Job任务作业什么时候出发,延迟多长时间开始执行,每隔多长时间执行一次。
  • JobDetail(作业任务):主要代表着对应的真正执行任务逻辑和运算流程,每一个Job任务都必须要有对应的name名称和分组group。

一个JobDetail可对应多个Trigger触发器

Trigger触发器

  • SimpleTrigger:从某个时间点开始,每隔多长时间触发,单位ms。如:1s后开始,每隔1s执行1次。

  • CalendarIntervalTrigger:从某个时间点开始,每隔多长时间触发,单位年、月、周、日、时、分、秒都可以。如:1s后开始,每个月执行1次。

  • DailyTimeIntervalTrigger:每天,从某个时间点到某个时间点,每隔多长时
    间触发,触发几次,周几到周几触发。如:周一至周五,每天8点到12点,每隔1小时执行1次。

  • CronTrigger:根据Cron表达式触发。

  • NthIncludedDayTrigger:每隔多少时间的第几天执行。如:每个月的第15天执行1次。

Calendar时期组件

Scheduler可以addCalendar,加入各种Calendar来排除执行,也就是什么时间不执行。如:AnnualCalendar、MonthlyCalendar、WeeklyCalendarCronCalendar、DailyCalendar、HolidayCalendar。对应每年、每月、每周、每天什么时候不执行、假期包括哪些。

JobListener工作监听器

scheduler.getListenerManager().addListener可以在获取Job名称后、被执行前、被拒绝后、执行结束后执行自定义的逻辑。

JobStore工作存储

Map、Set、List这些数据结构存储Job、Trigger、Calendar。

  • RAMJobStore:内存存储。
  • JDBCJobStore,数据库存储,官方提供了各种数据库下对应的sql文件,里面就是建表语句。

配置文件

spring_quartz.xml或者quartz.properties

集群Cluster

各节点配置同一个数据库作为JobStore,配置节点名称,打开集群开关。用select … for update抢到数据库的锁,获得触发任务执行的能力,保证不会重复执行任务。

运行流程

  1. QuartzSchedulerThread获取下一个即将触发的Trigger。
  2. 将Trigger和Job包装成JobRunShell。
  3. 用一个WorkerThread执行JobRunShell。
  4. 调用到Job的execute方法。

具体的源码暂时不进行详细介绍,后面会有专属章节进行分析和说明。

XXL-JOB任务调度框架

在这里插入图片描述

解决Quartz的不足

  1. 调度和任务耦合
  2. 随机负载
  3. 界面,动态调度
  4. 日志、监控、统计

XXLJOB的特点分析

  • 性能:支持更多任务;更快。
  • 可靠性:解决任务超时、任务失败、故障转移。
  • 运维:界面、日志、报表、告警、权限。

XXLJOB的模块

XXLJOB主要有3个部分构成:

  • core:核心执行包
  • admin(管理任务调度线程)
  • executor(管理任务执行线程)

执行器中任务阻塞的处理:

针对任务调度执行的时间超过了间隔时间的处理方式。

  • 单机串行(默认):新的任务排在原有的后面。
  • 丢弃后续调度:有正在执行的任务,就丢弃新来的任务,并标记为失败。
  • 覆盖之前调度:终止正在执行的任务,清空队列,运行本次任务。

Elastic-JOB任务调度框架

ElasticJob是一个分布式任务调度框架,它可以帮助开发人员快速实现分布式任务调度功能。本文将介绍ElasticJob的相关技术。

ElasticJob是一个功能强大的分布式任务调度框架,它可以帮助开发人员快速实现分布式任务调度功能。ElasticJob具有分布式任务调度、弹性扩容、失败转移、任务监控和多种任务类型等特点,适用于定时任务、数据处理和分布式计算等场景。开发人员可以通过引入依赖、配置任务、编写任务逻辑和启动任务等步骤来使用ElasticJob。
在这里插入图片描述

ElasticJob的基本原理

ElasticJob是一个基于Java开发的分布式任务调度框架,它可以帮助开发人员快速实现分布式任务调度功能。ElasticJob提供了两种任务调度方式:SimpleJob和DataflowJob。SimpleJob适用于简单的定时任务,而DataflowJob适用于数据处理任务。

ElasticJob的核心组件包括Job Scheduler、Job Facade、Job Registry、Job Executor和Job Core等。其中,Job Scheduler负责任务的调度,Job Facade提供了任务的管理接口,Job Registry负责任务的注册和发现,Job Executor负责任务的执行,Job Core负责任务的核心逻辑。

ElasticJob的特点

  1. 分布式任务调度:ElasticJob支持分布式任务调度,可以将任务分配到不同的节点上执行,提高任务的执行效率和可靠性。

  2. 弹性扩容:ElasticJob支持弹性扩容,可以根据任务的负载情况自动增加或减少节点,提高任务的可扩展性和灵活性。

  3. 失败转移:ElasticJob支持任务失败转移,可以将失败的任务转移到其他节点上执行,保证任务的可靠性和稳定性。

  4. 任务监控:ElasticJob提供了丰富的任务监控功能,可以实时监控任务的执行情况和节点的状态,方便开发人员进行故障排查和性能优化。

  5. 多种任务类型:ElasticJob支持多种任务类型,包括SimpleJob和DataflowJob,可以满足不同场景下的任务需求。

ElasticJob的应用场景

  1. 定时任务:ElasticJob可以用于定时任务的调度,例如定时生成报表、定时发送邮件等。

  2. 数据处理:ElasticJob可以用于数据处理任务的调度,例如数据清洗、数据同步等。

  3. 分布式计算:ElasticJob可以用于分布式计算任务的调度,例如MapReduce计算、Spark计算等。

ElasticJob的使用方法

  1. 引入依赖:在项目的pom.xml文件中添加ElasticJob的依赖。

  2. 配置任务:在项目的配置文件中配置任务的相关信息,例如任务名称、任务类型、任务参数等。

  3. 编写任务逻辑:根据任务类型编写任务的逻辑代码,例如SimpleJob的execute方法或DataflowJob的fetchData和processData方法。

  4. 启动任务:在项目中启动任务,ElasticJob会自动进行任务的注册和发现,并根据任务的负载情况进行任务的调度和执行。

ElasticJob的特点与其他调度框架的区别

  • Elastic-Job用Zookeeper。Quartz和XXL-Job用排它锁。
  • Elastic-Job和XXL-Job支持集群、任务分片、管理界面。
  • Elastic-Job是Apache孵化,XXL-Job是个人开发。

阿里的闭源任务调度— SchedulerX

SchedulerX是一个分布式任务调度平台,它可以帮助企业快速实现任务调度和管理。SchedulerX提供了多种任务调度方式,包括定时任务、消息队列任务、HTTP任务等。SchedulerX还提供了丰富的任务监控和报警功能,可以实时监控任务的执行情况和节点的状态,方便开发人员进行故障排查和性能优化。
在这里插入图片描述

SchedulerX的特点

  1. 分布式任务调度:SchedulerX支持分布式任务调度,可以将任务分配到不同的节点上执行,提高任务的执行效率和可靠性。

  2. 多种任务类型:SchedulerX支持多种任务类型,包括定时任务、消息队列任务、HTTP任务等,可以满足不同场景下的任务需求。

  3. 弹性扩容:SchedulerX支持弹性扩容,可以根据任务的负载情况自动增加或减少节点,提高任务的可扩展性和灵活性。

  4. 失败转移:SchedulerX支持任务失败转移,可以将失败的任务转移到其他节点上执行,保证任务的可靠性和稳定性。

  5. 任务监控:SchedulerX提供了丰富的任务监控功能,可以实时监控任务的执行情况和节点的状态,方便开发人员进行故障排查和性能优化。

  6. 报警功能:SchedulerX提供了报警功能,可以在任务执行异常或节点状态异常时发送报警信息,帮助开发人员及时处理问题。

SchedulerX的应用场景

  1. 定时任务:SchedulerX可以用于定时任务的调度,例如定时生成报表、定时发送邮件等。

  2. 消息队列任务:SchedulerX可以用于消息队列任务的调度,例如消费Kafka消息、消费RocketMQ消息等。

  3. HTTP任务:SchedulerX可以用于HTTP任务的调度,例如调用API接口、爬取网页数据等。

SchedulerX的使用方法

  1. 部署节点:在服务器上部署SchedulerX节点,可以使用Docker或手动部署。

  2. 创建任务:在SchedulerX控制台上创建任务,包括任务名称、任务类型、任务参数等。

  3. 编写任务逻辑:根据任务类型编写任务的逻辑代码,例如定时任务的execute方法或消息队列任务的consume方法。

  4. 启动任务:在SchedulerX控制台上启动任务,SchedulerX会自动进行任务的注册和发现,并根据任务的负载情况进行任务的调度和执行。

最后总结

总之,Java中的任务调度技术是非常重要的一部分,它可以帮助开发人员更好地管理和分配任务,从而提高系统的效率和可靠性。Java中有许多常见的任务调度工具,开发人员可以根据自己的需求选择适合自己的工具。

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

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

相关文章

精品SpringCloud图书馆管理系统-微服务-分布式

《[含文档PPT源码等]精品基于SpringCloud实现的图书馆管理系统的设计与实现-微服务-分布式》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具: 开发语言:Java 框架:springcloud JDK版本&…

【力扣-每日一题】337. 打家劫舍 III

class Solution { public:pair<int,int> dfs_rob(TreeNode *root){//如果为根节点if(rootnullptr)return {0,0};auto [l,l_n]dfs_rob(root->left);auto [r,r_n]dfs_rob(root->right);int ol_nr_nroot->val;//当前节点偷&#xff0c;所获得的利益,子节点不能偷in…

第二章 交换基础

目录 2.1 交换机概述 2.1.1 交换机的定义 2.1.2 交换机的接口 2.1.3 交换机的互连方式 2.1.3.1 级联 2.1.3.2 堆叠 2.1.4 交换机工作原理 2.1.4.1 转发 2.1.4.2 过滤 2.1.4.3 扩散 2.1.4.4 广播 2.1.4.5 源地址学习 2.1.5 交换机的作用 2.2 交换机作用仿真 2.2.…

Excel 通过条件格式自动添加边框

每录入一次数据就需要手动添加一次边框&#xff0c;非常麻烦&#xff0c;这不是我们想要的。 那么有没有办法&#xff0c;在我们录入数据后&#xff0c;自动帮我们加上边框呢&#xff1f; 选中要自动添加边框的列&#xff0c;然后按箭头流程操作 ↓ ↓ ↓ ↓

基于DSPACE功率平衡理论的并联有源电力滤波器模型(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

python如何操作mysql数据库

目录 python操作mysql数据库 怎么提高效率 注意事项 总结 Python 是一种流行的编程语言&#xff0c;它提供了许多库和工具来操作 MySQL 数据库。在 Python 中&#xff0c;你可以使用诸如 pymysql、mysql-connector-python、SQLAlchemy 等库来与 MySQL 数据库进行交互。这些…

微信公众号小说系统源码 漫画系统源码 可对接微信公众号 APP打包 对接个人微信

源码描述&#xff1a;修复版掌上阅读小说源码_公众号漫画源码可以打包漫画app ■产品介绍 掌上阅读小说源码支持公众号、代理分站支付功能完善强大的小说源码&#xff0c;公众号乙帅读者&#xff0c; 可以对接微信公众号、APP打包。支持对接个人微信收款。 ■产品优势 1新…

解决Permission is not allowed后基于Ubuntu23.04安装配置docker与docker-compose

参考&#xff1a;Docker官网-Install Docker Engine on Ubuntu 一、 Install using the Apt repository 1.1 Set up Docker’s Apt repository 1.1.1 Add Docker’s official GPG key # Add Dockers official GPG key: sudo apt-get updatesudo apt-get install ca-certifi…

【AI视野·今日Sound 声学论文速览 第六期】Mon, 18 Sep 2023

AI视野今日CS.Sound 声学论文速览 Mon, 18 Sep 2023 Totally 1 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Audio-Visual Active Speaker Extraction for Sparsely Overlapped Multi-talker Speech Authors Junjie Li, Ruijie Tao, Zexu Pan, Meng…

解决express服务器接收post请求报错:“req.body==> undefined“

现象如下&#xff1a; 解决办法&#xff1a;在代码中加入body-parser解析 const bodyParser require("body-parser"); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); 参考&#xff1a; How to fix "req.body undefined&q…

buuctf-[极客大挑战 2019]HardSQL

很久没做sql了。。 打开这题&#xff0c;还想拿sqlmap跑&#xff0c;但是没跑出来&#xff0c;要手注了 先用万能密码登了一下 回显&#xff0c;是有爆东西的 然后就想到先用bp fuzz字典跑一下 就看到等号被过滤了&#xff0c;要用like来过滤 然后就去搜了很多用like过滤的…

北工大汇编题——分支程序设计

题目要求 信息检素程序设计&#xff1a;在数据区&#xff0c;有9个不同的信息&#xff0c;编号 0-8&#xff0c;每个信息包括20 个字符。从键盘接收 0-8 之间的一个编号&#xff0c;然后再屏幕上显示出相应编号的信息内容&#xff0c;按“q”键退出 完整代码 DATAS SEGMENTn0…

2023 Google 开发者大会:将大型语言模型部署到你的手机

在2022年末&#xff0c;不到半年时间&#xff0c;各家大语言模型的发展如雨后春笋&#xff0c;截至2023年9月&#xff0c;全球总共有接近100个大语言模型&#xff0c;可谓是百花齐放 显而易见&#xff0c;大语言模型凭借出色的AI对话能力&#xff0c;已经逐渐深入各个行业 20…

TUME加湿器上架店铺UL998测试报告

加湿器按用途主要分为家用加湿器和工业用加湿器两种类型。超声波加湿器采用超声波高频震荡1.7MHZ频率&#xff0c;将水雾化为1-5微米的超微粒子&#xff0c;能清新空气&#xff0c;增进健康&#xff0c;营造舒适的环境。 直接蒸发型加湿器也通常被称为纯净型加湿器。纯净加湿技…

口罩识别检测开源数据集汇总

SF-MASK 数据集下载链接&#xff1a;http://suo.nz/2E6ADA 从监控录像中对有面具和无面具的人脸进行分类是最困难的任务之一&#xff0c;数据集SF-MASK来解决这些问题&#xff0c;该数据集适用于小尺寸人脸、部分隐藏的人脸、各种人脸方向和各种面具类型等。SF-MASK是通过收集…

new/delete, malloc/free 内存泄漏如何检测

区别&#xff1a; 首先new/delete是运算符&#xff0c;malloc/free是库函数。malloc/free只开辟内存不初始化&#xff1b;new/delete及开辟内存也初始化。抛出异常的方式&#xff1a;new/delete开辟失败使用抛出bad_alloc&#xff1b;malloc/free通过返回值判断。malloc和new区…

华为OD机试-仿LISP运算

题目描述 代码实现 # coding:utf-8 # 仿LISP运算 # https://www.nowcoder.com/discuss/360006188531032064?sourceSSRsearch import systry:while True:line sys.stdin.readline().replace((, ( ).replace(), )).strip().split( )if line :breakstack []op []error_flag…

HCIE-容器docker

1、安装配置操作系统&#xff0c;使用CentOS stream 8镜像 之前&#xff1a;RHEL 8.4 发布了&#xff0c;CentOS紧随其后&#xff0c;发布CentOS 8.4 之后&#xff1a;CentOS 走在前面&#xff0c;成为RHEL上游&#xff0c;再去发布RHEL 制作模板&#xff0c;模板配置要求&…

three.js——GUI的使用

GUI的使用 效果图1、导入gui2、创建一个GUI对象3、通过gui调用方法 name:按钮的名称 效果图 1、导入gui // 导入ligui import { GUI } from three/examples/jsm/libs/lil-gui.module.min.js2、创建一个GUI对象 const gui new GUI()3、通过gui调用方法 name:按钮的名称 // 创…

Cpp/Qt-day020918Qt

目录 完善登录框 点击登录按钮后&#xff0c;判断账号&#xff08;admin&#xff09;和密码&#xff08;123456&#xff09;是否一致&#xff0c;如果匹配失败&#xff0c;则弹出错误对话框&#xff0c;文本内容“账号密码不匹配&#xff0c;是否重新登录”&#xff0c;给定两…