引言

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

Quartz基础结构

Quartz对任务调度的领域问题进行了高度抽象,提出了调度器、任务和触发器这3个核心的概念,并在org.quartz中通过接口和类对核心概念进行了描述。

1.Job

Job是一个接口,只有一个方法void execute(JobExecutionContext context),开发者通过实现该接口来定义需要执行的任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMap实例中。

2.JobDetail

Quartz在每次执行Job时,都会重新创建一个Job实例,所以它不是直接接受一个Job实例,而是接受一个Job实现类,以便运行时通过newInstance()的反射调用机制实例化Job。因此需要通过一个类来描述Job的实现类及其他相关的静态信息,如Job名称、描述、关联监听器等信息,而JobDetail承担了这个角色。通过该接口实现类JobDetailImpl的构造函数JobDetail(java.lang.String name,java.lang.String group,java.lang.Class jobClass),可以更具体地了解它的功用。该构造函数要求指定Job的实现类,以及任务在Scheduler中的组名和Job名称。

3.Trigger

Trigger是一个类,描述触发Job执行的实现触发规则。主要有SimpleTrigger和ConTrigger这两个类。当仅需要触发一次或者以固定间隔周期性执行时,SimpleTrigger是最合适的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂的调度方法,如每天早晨9:00执行,每周一、周三、周五下午5:00执行等。

4.Calendar

与java.util.Calendar不同,org.quartz.Calendar是一些日历特定时间点的集合(可以简单地将org.quartz.Calendar看作java.util.Calendar的集合)。一个Trgger可以和多个Calendar关联,以便排除或包含某些时间点。假设安排每周一早晨10:00执行任务,但是如果遇到法定节假日,则不执行任务,这是就需要在Trigger触发机制的基础上使用Calendar进行排除。针对不同的事件类型,Quartz在org.quartz.impl.calendar包下提供了若干个Calendar的实现类,如AnnualCalendar、MonthlyCalendar、WeeklyCalendar分别针对每年、每月和每周进行定义。

5.Schuduler

Scheduler代表一个Quartz的的独立运行容器,Trigger和JobDetail可以注册到Schduler中,二者在Scheduler中拥有各自的组及名称。组及名称是Scheduler查找定位容器中某一对象的依据。Trigger的组及名称的组合必须唯一。JobDetail的组及名称的组合也必须唯一(但是可以和Trigger的组及名称相同,因为它们是不同类型的,处在不同的集合中)。

6.ThreadPool

Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程来提高运行效率。

StatefulJob

Job有一个StatefulJob子接口,代表有状态的任务。该接口是一个没有方法的标签接口,其目的是让Quartz知道任务的类型,以便采用不同的执行方案。无状态任务在执行时拥有自己的JobDataMap复制,对JobDataMap的更改不会影响下次的执行。而有状态任务共享同一个JobDataMao实例,每次任务执行对JobDataMap所做的更改会保存下来,后面的执行可以看到这个更改,即每次窒息感任务后都会对后面的执行产生影响。

正因为这个原因,于状态的Job可以并发执行,而有状态的StatefulJob不能并发执行。这意味着如果前次的StatefulJob还没有执行完毕,则下次任务将阻塞等待,直到前次任务执行完毕。有状态任务比无状态任务需要考虑更多的因素,程序往往更复杂,因此除非必须,应尽量避免使用有状态的Job。

如果Quartz使用数据库持久化任务调度信息,则无状态的JobDataMap仅会在Scheduler注册任务时保存一次,而有状态任务对应的JobDataMap在每次执行任务后都会进行保存。

Trigger自身也可以拥有一个JobDataMap,其关联的JobDataMap可以通过JobExecutionContext#getTrigger().getJobDataMap()方法获取。不管是有状态还是无状态的任务,在任务执行期间对Trigger的JobDataMap所做的更改都不会进行持久化,即不会对下次任务的执行产生影响。

小结

Quartz完整下载包examples目录下拥有10多个实例,它们是快速掌握Quartz应用很好的实例。

Quartz简答介绍的更多相关文章

  1. 【转】awk、nawk、mawk、gawk的简答介绍

    来自http://blog.sina.com.cn/s/blog_3d2d79aa0100h47h.html awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准 ...

  2. awk、nawk、mawk、gawk的简答介绍

    awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入.一个或多个文件,或其它命令的输出(即管道).它支持用户自定义函数和 动态正则表达式等先进功能,是linu ...

  3. linux系统运维面试题简答

    1.     简述常用高可用技术 解答: Keepalived:Keepalived是一个保证集群高可用的服务软件,用来防止单点故障,使用VRRP协议实现.在master和backup之间通过mast ...

  4. Docker理论简答

    Docker理论简答: 1.        介绍对docker的认识(10分) Docker是容器,容器不是docker Dockers就是一个文件夹,它欺骗操作系统说自己是一个操作系统,然后把所需要 ...

  5. 实现quartz定时器及quartz定时器原理介绍

    今天研究定时器,在网上看了一篇不错的文章,推荐给大家! 实现quartz定时器及quartz定时器原理介绍

  6. 对怎样充分利用安卓官方开发网站的一个简单性介绍介绍-https://developer.android.google.cn/docs/

    一,谷歌的安卓官方网站-https://developer.android.google.cn/docs/ ,在网站里面可以查询开发文档,开发指导,设计原则,制作app的例子等等,无论对于新手还是老手 ...

  7. 安装python包时遇到"error: Microsoft Visual C++ 9.0 is required"的简答

    简答 在Windows下用pip安装Scrapy报如下错误, error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall ...

  8. 【Python】安装python包时遇到"error: Microsoft Visual C++ 9.0 is required"的简答

    简答 在Windows下用pip安装Scrapy报如下错误, error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall ...

  9. 【ios系列】-Quartz 2D常用方法介绍

    Quartz 2D基本介绍 Quartz 2D是一个二维绘图引擎 能够,绘制图形 : 线条\三角形\矩形\圆\弧等,绘制文字,绘制\生成图片(图像),读取\生成PDF,截图\裁剪图片,自定义UI控件( ...

随机推荐

  1. Python爬虫之自制英汉字典

      最近在微信公众号中看到有人用Python做了一个爬虫,可以将输入的英语单词翻译成中文,或者把中文词语翻译成英语单词.笔者看到了,觉得还蛮有意思的,因此,决定自己也写一个玩玩~~   首先我们的爬虫 ...

  2. 【转】探讨:ASP.NET技术的学习顺序问题

    摘要:很多人对于ASP.NET的入门和学习顺序比较迷茫,今天让我们一起来跟随作者的思路学习探讨ASP.NET的学习顺序问题,希望有所帮助. 如果你已经有较多的面向对象开发经验,跳过以下这两步: 第一步 ...

  3. [转]用C#在windows上操控电脑自带蓝牙(入道指南)

    本文转自:https://blog.csdn.net/YSSJZ960427031/article/details/50990372 前言如题,如果你也想用C#在windows上操控电脑自带蓝牙,但是 ...

  4. 【转载】 IIS服务器防盗链设置

    在实际运行的服务器环境中,我们自己网站中的资源一般不希望被外部网站引用,被外部网站引用IIS网站中的资源文件,一是会加重了服务器的负担,二是占用了你自己服务器的外网带宽资源,因此我们希望防止盗链这种情 ...

  5. Docker 系列七(Dubbo 微服务部署实践).

    一.前言 之前我们公司部署服务,就是大家都懂的那一套(安装JDK.Tomcat —> 编译好文件或者打war包上传 —> 启动Tomcat),这种部署方式一直持续了很久,带来的问题也很多: ...

  6. learnVUE-note

    title: learnVUE-note date: 2018-02-27 15:57:37 tags: categories: 前端技术 --- 本文是自己在学习Vue中的 VUE事件处理 在事件处 ...

  7. laravel前后台路由分离

    在laravel中创建文件放置前台和后台控制器 找到app/providers/RouteServiceProvider.PHP文件 在内配置 例: <?php namespace App\Pr ...

  8. Python中字典dict

    dict字典 字典是一种组合数据,没有顺序的组合数据,数据以键值对形式出现 # 字典的创建 # 创建空字典1 d = {} print(d) # 创建空字典2 d = dict() print(d) ...

  9. 关于select 文字居向

    我们都知道select的文字默认居左,而如果你想改变它,用text-align是不起作用的,因为select没有这个样式 但是它有自己的样式属性 文字靠右对齐:direction: rtl; 而如果要 ...

  10. 简单选择排序算法的C++实现

    简单选择排序采用最简单的选择方法,即在剩余序列中选出最小(或最大)的关键字,和剩余序列的第一个关键字交换位置,依次选择下去,直至使整个序列有序. 算法中两层循环的执行次数和初始序列没有关系,第二层循环 ...