Quartz概述

2023-11-01

          Quartz是开源任务调度框架中的翘楚,它提供了强大的 任务调度机制。Quartz允许开发人员灵活的定义触发器的调度时间表,并可对触发器和任务进行关联映射。此外,Quartz提供了调度运行环境的持久化机制,可以保存并恢复调度现场,即使系统因故障关闭,任务调度现场数据并不会丢失。此外,Quartz还提供了组件式的侦听器、各种插件、线程池等功能。

 一、Quartz基础结构

        Quartz对任务调度的领域问题进行了高度抽象,提出了调度器、任务和触发器这3个核心的概念,并在org.quartz通过接口和类的核心概念进行描述。
          1)Job:是一个接口,只有一个方法void execute(JobExecutionContext   context) ,开发者实现该接口定义需要执行的任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMap实例中。
          2)JobDetail:Quartz在每次执行Job时,都重新创建一个Job实例,所以它不是直接接受一个Job的实例,而是接收一个Job实现类,以便运行时通过newInstance()的反射调用的机制实例化Job。因此需要通过一个类来描述Job的实现类及其他相关的静态信息,如Job名称、描述、关联监听器等信息,JobDetail承担了这一角色。通过该类的构造函数可以更具体地了解它的功用:JobDetail(java.lang.String name,java.lang.String group,java.lang.Class   jobClass),该构造函数要求指定Job的实现类,以及任务在Scheduler中的组名和Job名称。 
        3)Trigger:是一个类,描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。当仅需要触发一次或者以固定间隔周期性执行,SimplegTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂的调度方案:如每天早晨9:00执行,每周一、周三、周五下午5:00执行等。
        4)Calendar:org.quartz.Calendar和java.util.Calendar不同,它是一些日历特定时间点的集合(可以简单地将org.quartz.Calendar看作java.util.Calendar的集合------java.util.Calendar代表一个日历时间点,无特殊说明后面的Calendar即指org.quartz.Calendar).一个Trigger可以和多个Calendar关联,以便排除或包含某些时间点。假设,我们安排每周星期一早上10:00执行任务,但是如果碰到法定的节日,任务则不执行,这时就需要在Trigger触发机制的基础上使用Calendar进行定点排除。针对不同的时间段类型,Quartz在org.quartz.impl.calendar包下提供了若干个Calendar的实现类,如AnnualCalendar、MonthlyCalendar、WeekleyCalendar分别针对每年、每月和每周进行定义。
        5)Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Scheduler中,两者在Scheduler中拥有各自的组及名称。组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称的组合必须唯一,JobDetail的组和名称的组合也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的,处在不同的集合中)。Scheduler定义了多个接口方法,允许外部通过组及名称访问和控制容器中的Trigger和JobDetail。Scheduler可以将Trigger绑定到某一JobDetail中,这样当Trigger被触发时,对应的Job就被执行。一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job. 可以通过SchedulerFactory创建一个Scheduler实例。Scheduler拥有一个SchedulerContext,保存着Scheduler上下文信息,可以对照你熟悉的ServletContext来理解SchedulerContext。Job和Trigger都可以访问SchedulerContext内的信息。SchedulerContext内部通过个Map,以键值对的方式维护这些上下文数据,SchedulerContext为保存和获取数据提供了多个put()和getXxx方法。可以通过Scheduler#getContext()获取对应的SchedulerContext实例。
        6)ThreadPool:Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。
 

二、有状态的任务和无状态的任务

        Job有一个StatefulJob子接口,代表有状态的任务,该接口是一个没有方法的标签接口,其目的就是让Quartz知道任务的类型,以便采取不同的执行方案。无状态任务在执行时拥有自己的JobDataMap复制,对JobDataMap的更改不会影响下次的执行。而有状态的任务共享一个JobDataMap实例,每次任务执行时对JobDataMap所做的更改会保存下来,后面的执行可以看到这个更改,即每次执行任务后都会对后面的执行发生影响。
        正因为这个原因,无状态的Job可以并发执行,而有状态的StatefulJob不能并发执行,这意味着如果前次的StatefulJob还没有执行完毕,下一次的任务将阻塞等待,直到前次任务执行完毕。有状态任务比无状态任务需要考虑更多的因素,程序往往更复杂,因此除非必要,应尽量避免使用有状态的Job.
        如果Quartz使用了数据库持久化任务调度信息,无状态的JobDataMap仅会在Scheduler注册任务时保存一次,而有状态任务对应的JobDataMap在每次执行任务后都会进行保存。
        Trigger自身也可以拥有一个JobDataMap,期关联的JobDataMap可以通过JobExecutionContext#getTrigger().getJobDataMap获取。不管有状态还是无状态的任务,在任务执行期间对Trigger的JobDataMao所做的更改都不会进行持久化,即不会对下次任务的执行产生影响。
        Quartz拥有完善的事件和监听体系,大部分组件都拥有事件、如任务执行前事件、任务执行后事件、触发器触发前事件、触发后事件、调度器开始事件、关闭事件等,可以注册相应的监听器处理感兴趣的事件。
       下图描述了Scheduler的内部组件结构,SchedulerContext提供Scheduler全局可见的上下文信息,每一个任务都对应一个JobDataMap,虚线表达的JobDataMap表示对应有状态的任务:
                                                           
一个Scheduler可以拥有多个Trigger和多个JobDetail,它们可以分到不同的组中。注册Trigger和JobDetail时,如果不显示指定所属的组,Scheduler将放入到默认组中,默认组的组名为Scheduler.DEFAULT_GROUP。组名和名称组成了对象的全名。同一类型对象(即Job或Trigger)的全名不能相同。
Scheduler本身就是一个容器,它维护者Quartz的各种组件并实施调度的规则。Scheduler还拥有一个线程池,线程池为任务提供执行线程-----这比执行任务时简单的创建一个新线程要拥有更高的效率,同时通过共享机制减少资源的占用。通过线程池组件的支持,对于繁忙度高、压力大的任务调度,Quartz可以提供良好的伸缩性。
 
注:Quartz完整下载包examples目录下拥有10多个实例,它们是快速掌握Quartz应用很好的实例.
 
 
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Quartz概述 的相关文章

  • 电机控制基础——定时器基础知识与PWM输出原理

    单片机开发中 电机的控制与定时器有着密不可分的关系 无论是直流电机 步进电机还是舵机 都会用到定时器 比如最常用的有刷直流电机 会使用定时器产生PWM波来调节转速 通过定时器的正交编码器接口来测量转速等 本篇先介绍定时器的基础知识 然后对照
  • SpringBoot整合Quartz实现定时任务(单任务、多任务)

    前言 为了实现如 定时发送邮件 订单超时等操作需要使用到任务调度 为了节约自己封装的时间所以使用Quatrz开源项目来帮助我们实现这些繁杂的操作 Quatrz内部有自己的线程池 不需要我们去手动维护线程 而且支持cron表达式等 下面我们讲
  • 高通平台环境搭建,编译,系统引导流程分析

    1 高通平台android开发总结 1 1 搭建高通平台环境开发环境 在高通开发板上烧录文件系统 建立高通平台开发环境 高通平台 android和 modem 编译流程分析 高通平台 7620 启动流程分析 qcril 流程分析 设置sim
  • 定时任务@Scheduled用法及其参数讲解

    1 基本用法 Scheduled 由Spring定义 用于将方法设置为调度任务 如 方法每隔十秒钟被执行 方法在固定时间点被执行等 Scheduled fixedDelay 1000 上一个任务结束到下一个任务开始的时间间隔为固定的1秒 任
  • Quartz学习总结之核心接口Scheduler、Job

    参考文章 https www cnblogs com mengrennwpu p 7141986 html 核心接口如下 接口 含义 Scheduler scheduler的主要API接口 Job 任务实现接口 期望调度器能够执行 JobD
  • Quartz 之 Job参数 和 Job状态

    项目地址 https github com yuleiqq quartz example tree master quartz study 此示例旨在演示如何将运行时参数传递给quartz作业 以及如何维护作业中的状态 程序将执行以下操作
  • SpringBoot与quartz框架实现分布式定时任务

    目录 前言 一 介绍 1 Quartz 核心概念 2 原理图 二 使用步骤 1 引入依赖 2 在项目中添加quartz properties文件 不添加该文件该框架会加载自带的properties文件 3 在数据库中创建quartz相关的表
  • Quartz和Spring Task定时任务的简单应用和比较

    一 Quartz 引入quartz的jar包 配置文件中定义org springframework scheduling quartz MethodInvokingJobDetailFactoryBean 并指定它的targetObject
  • quartz对于定时任务Misfire的处理

    使用quartz过程中 产生了很多问题 遇到就记录一下 虽然用的比较少了 但还是有一些项目在使用 问题描述 创建一个每天执行的任务test1 创建自动运行状态 然后停止任务 一直等到当天定时时间过去 然后再启动 发现定时任务还是先执行了一次
  • JavaEE初阶(5)多线程案例(定时器、标准库中的定时器、实现定时器、线程池、标准库中的线程池、实现线程池)

    接上次博客 JavaEE初阶 4 线程的状态 线程安全 synchronized volatile wait 和 notify 多线程的代码案例 单例模式 饿汉懒汉 阻塞队列 di Dora的博客 CSDN博客 目录 多线程案例 定时器 标
  • 看门狗定时器

    看门狗定时器 WDT Watch Dog Timer 是单片机的一个组成部分 它实际上是一个计数器 一般给看门狗一个数字 程序开始运行后看门狗开始倒计数 如果程序运行正常 过一段时间CPU应发出指令让看门狗复位 重新开始倒计数 如果看门狗减
  • Java解析cron表达式

    概述 Cron表达式是一个字符串 以5或6个空格隔开 分为6或7个域 每一个域代表一个含义 即两种语法格式 Seconds Minutes Hours DayofMonth Month DayofWeek Year 即 秒 分 时 天 月
  • 找不到org.springframework.scheduling.quartz.SchedulerFactoryBean类

    在spring整合quartz项目中 找不到org springframework scheduling quartz SchedulerFactoryBean类 解决方法之一 导入spring context support 4 2 4
  • 升序定时器的时间链表的完全实现

    李邦柱 helpylee 126 com 1 定时器简介 定时器通常包含至少两个成员 一个超时时间 通常采用相对时间或者超时时间 和一个超时时间到达后的一个回调函数 有时候还可能包含回调函数被执行时需要传入的参数 以及是否重新启动定时器 更
  • STM32定时器----TIMx->SR寄存器

    在研究stm32定时器时发现 当进入定时器的中断时 定时器计数器以及中断接收时正常运行的 并没有因为进入中断而停止 具体看以下分析 定时器初始化代码 TIM捕获通道开启宏定义 1 开启 0 关闭 define TIM ICCH1 1 def
  • Quartz 基本使用

    Quartz 基本使用 一 Quartz的核心概念 二 Quartz的几个常用API 三 Quartz的使用 四 Quartz核心详解 五 JobListener 六 TriggerListener 七 SchedulerListener
  • C51单片机数码管动态显示

    数码管作为最廉价的输出设备 在各种自动化设备中有很大的应用 最简单普通的显示方式为动态刷新显示 称为假动态显示 即通过分时扫描每一位 利于人眼的视觉停留现象 造成一种静态显示的效果 如下图所示 C51单片机由于运行速度很慢 在高刷新频率下
  • 【MedusaSTears】复杂定时任务SpringBoot+Quartz实例,解决jobclass如何注入一个service类,以及实现简单业务逻辑

    目录 吃水不忘挖井人系列 1 认识了解各种定时任务实现方式 2 本文主要参考 3 其他参考 一 业务需求 这里提一下我对 Scheduled和Quartz的一点小看法 如有误解还请指正 二 软件环境 java版本 SpringBoot版本
  • Quartz Scheduler:如何仅在一台机器上运行作业?

    我正在尝试将quartz 设置为在两台机器上执行 共享相同的数据库 如何设置quartz仅在一台机器上运行一个作业 或一组作业 另一台机器无法选择该作业 你能详细说明一下你的问题吗 1 如果您希望两台机器共享负载 但希望在任何给定时间只运行
  • 如何处理 cron 触发器石英中夏令时的用户时区?

    我的服务 api 接受石英作业的开始日期和要执行的作业的月份日期 在内部 我将其转换为 cron 表达式并保存在quartz 中 例如 PST 中的用户今天 2017 年 11 月 3 日 提交了如下作业请求 start 2017 11 0

随机推荐

  • vs2019 MFC 如何在框架类中实现添加一个按钮button

    首先 在框架类CMainFrame中添加一个CButton m btn的成员 然后 在框架类CMainFrame中OnCreate 函数最后添加创建button的函数并显示button 注意 在创建button函数create中如果使用了W
  • 安装VTK8.2.0-win 实际操作

    Windows下安装VTK8 2 0 1 依赖 VS2017 Qt5 cmake 2 前期准备 2 1 访问vtk官方下载VTK8 2 0源码 VTK源码下载地址 https vtk org download 2 2 配置环境变量 配置CM
  • Cookie与Session之(简单购物车示例)

    Cookie 实际上是一小段的文本信息 客户端请求服务器 如果服务器需要记录该用户状态 就使用 response 向客户端浏览器颁发一个 Cookie 客户端浏览器会把 Cookie 保存起来 当浏览器再请求该网 站时 浏览器把请求的网址连
  • tailwind css_带有Tailwind CSS和Nuxt.js的深色和浅色主题

    tailwind css Dark and light mode support has been a recent trend due to the impact on our eyesight caused by the time sp
  • 软件测试面试题--(含mysql,linux,出现最频繁)

    这些是我觉得会问道 但不限于所有的 我列出一些 但并不是所有 软件测试是一个漫长的过程 这需要我们有耐心 和细心 还有一个好学习和认真的态度去进行 小伙伴们可以通过背诵然后结合自己的陈述去进行完善和结果专业知识去进行解答 一 软件测试基础
  • DOS命令查询局域网内在线电脑IP

    COLOR 0A CLS ECHO Off Title 查询局域网内在线电脑IP send ECHO off setlocal enabledelayedexpansion ECHO 正在获取本机的IP地址 请稍等 for f tokens
  • 自己个人总结,Android Studio 中SVN的使用步骤

    要使用SVN 首先需要下载SVN的软件 在这里需要下载两款软件 第一款是Svn的服务器端 第二款是Svn的客户端 俗称的小乌龟 软件的下载地址 Svn客户端软件的下载 64位 http download csdn net detail la
  • FPGA流水线除法器(Verilog)原理及实现

    FPGA流水线除法器 Verilog 原理及实现 流水线除法器原理 除法器的计算过程如下图所示 计算步骤 假设数值的位宽为N Step1 分别将被除数和除数扩展至原来2倍位宽 2N 被除数在其左边补N位0 除数在其右边补N位0 Step2
  • mac 下 ~/.bash_profile无效

    1 问题 在配置 bash profile时候项目不生效 2 解决思路 我们使用的shell是zsh 不会自动加载 bash profile 而是自动加载 zprofile文件 这里可以在 zprofile文件加上这么一段 if f bas
  • Python学习笔记第五天(Number)

    Python学习笔记第五天 数据类型 Number 数字 支持四种不同的数值类型 Number 类型转换 数学函数 随机数函数 三角函数 数学常量 结束语 数据类型 在Python中 对象是数据的抽象表示 而引用则是指向对象的指针 Pyth
  • AB实验遇到用户不均匀怎么办?—— vivo游戏中心业务实践经验分享

    作者 vivo 互联网数据分析团队 Li Bingchao AB实验是业务不断迭代 更新时最高效的验证方法之一 但在进行AB实验效果评估时需要特别关注 用户不均匀 的问题 稍不注意 产出的研究结论就可能谬以千里 给业务决策带来极大风险 因此
  • 数据库文件扩展名

    不同的数据库扩展名不同 SQL的就是MDF Access数据库的扩展名是 mdb MSSql数据库的扩展名是 mdf Paradox数据库的扩展名是 DB Oracle数据库的扩展名是 DBF dBase数据库的扩展名是 DBF FoxPr
  • ERROR:Dependency ‘mysql:mysql-connector-java:5.1.38‘ not found

    问题描述 报错信息 Dependency mysql mysql connector java 5 1 38 not found 原因分析 settings xml中未添加镜像源 解决方案 在当前maven项目中 右键选择 Maven gt
  • 测试五:使用Charles抓包

    1 安装Charles 我使用的电脑是mac 本文也是记录在mac下如何安装并使用charles抓线上https的包以及普通http的包 官网地址 https www charlesproxy com download charles默认使
  • Data Augmentation techniques in time series domain: A survey and taxonomy

    本文是对 Data Augmentation techniques in time series domain A survey and taxonomy 的翻译 时间序列域的数据增强技术 综述与分类 摘要 1 引言 2 相关工作 3 背景
  • 最大子数组和Python解法

    给你一个整数数组 nums 请你找出一个具有最大和的连续子数组 子数组最少包含一个元素 返回其最大和 子数组 是数组中的一个连续部分 例 输入 nums 2 1 3 4 1 2 1 5 4 输出 6 解释 连续子数组 4 1 2 1 的和最
  • Linux中nginx如何重启、启动与停止/设置开机自启动

    一 启动 usr local nginx sbin nginx c usr local nginx conf nginx conf 启动代码格式 nginx安装目录地址 c nginx配置文件地址 例如 root localhost usr
  • Unity3D性能优化——工具篇

    性能优化是游戏项目开发中一个重要且必须的元素 用户和项目的需求在并且会持续增长 而即便在硬件设备高速发展的今天 游戏特效 画质 场景复杂度的需求也都向着榨干硬件性能的趋势提升 无论研发团队有多么丰富的经验积累 性能优化永远是一个非常棘手而又
  • 操作系统理论知识9

    我的操作系统笔记 第四章 存储器管理 存储器部件 主存 保存进程运行时的程序和数据 寄存器 速度最快 价格昂贵容量不大 一般以字为单位 只要存放指令一次操作的数据就够了 高速缓存 速度快 存放部分内存数据 硬件自动处理 磁盘缓存 内存的一部
  • Quartz概述

    Quartz是开源任务调度框架中的翘楚 它提供了强大的 任务调度机制 Quartz允许开发人员灵活的定义触发器的调度时间表 并可对触发器和任务进行关联映射 此外 Quartz提供了调度运行环境的持久化机制 可以保存并恢复调度现场 即使系统因