Quartz基于Java实现开源调度框架的应用

Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。该项目于 2009 年被 Terracotta 收购,目前是 Terracotta 旗下的一个项目。读者可以到 http://www.quartz-scheduler.org/站点下载 Quartz 的发布版本及其源代码。笔者在产品开发中使用的是版本 1.8.4,因此本文内容基于该版本。本文不仅介绍如何应用 Quartz 进行开发,也对其内部实现原理作一定讲解。

作为一个优秀的开源调度框架,Quartz 具有以下特点:

强大的调度功能,
例如支持
丰富多样的调度方法,可以满足各种常规及特殊需求; 灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式; 分布式和集群能力,Terracotta 收购后在原来功能基础上作了进一步提升。本文暂不讨论该部分内容

另外,作为 Spring 默认的调度框架,Quartz 很容易与 Spring 集成实现灵活可配置的调度功能。

下面是本文中用到的一些专用词汇,在此声明:

scheduler: 任务调度器 trigger: 触发器,用于定义任务调度时间规则 job: 任务,即被调度的任务 misfire: 错过的,指本来应该被执行但实际没有被执行的任务调度

Quartz 任务调度的基本实现原理

核心元素

Quartz 任务调度的核心元素是 scheduler, trigger 和 job,其中 trigger 和 job 是任务调度的元数据, scheduler 是实际执行调度的控制器。

在 Quartz 中,trigger 是用于定义调度时间的元素,即按照什么时间规则去执行任务。Quartz 中主要提供了四种类型的 trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger,和 NthIncludedDayTrigger。这四种 trigger 可以满足企业应用中的绝大部分需求。我们将在企业应用一节中进一步讨论四种 trigger 的功能。

在 Quartz 中,job 用于表示被调度的任务。主要有两种类型的 job:无状态的(stateless)和有状态的(stateful)。对于同一个 trigger 来说,有状态的 job 不能被并行执行,只有上一次触发的任务被执行完之后,才能触发下一次执行。Job 主要有两种属性:volatility 和 durability,其中 volatility 表示任务是否被持久化到数据库存储,而 durability 表示在没有 trigger 关联的时候任务是否被保留。两者都是在值为 true 的时候任务被持久化或保留。一个 job 可以被多个 trigger 关联,但是一个 trigger 只能关联一个 job。

在 Quartz 中, scheduler 由 scheduler 工厂创建:DirectSchedulerFactory 或者 StdSchedulerFactory。 第二种工厂 StdSchedulerFactory 使用较多,因为 DirectSchedulerFactory 使用起来不够方便,需要作许多详细的手工编码设置。 Scheduler 主要有三种:RemoteMBeanScheduler, RemoteScheduler 和 StdScheduler。本文以最常用的 StdScheduler 为例讲解。这也是笔者在项目中所使用的 scheduler 类。

Quartz 核心元素之间的关系如下图所示:

图 1. Quartz 核心元素关系图

线程视图

在 Quartz 中,有两类线程,Scheduler 调度线程和任务执行线程,其中任务执行线程通常使用一个线程池维护一组线程。

图 2. Quartz 线程视图

时间: 2024-10-03 18:18:01

Quartz基于Java实现开源调度框架的应用的相关文章

JasperReports 4.1.1发布 基于Java的开源报表工具

JasperReports 4.1.1这个版本引入了一个新的http://www.aliyun.com/zixun/aggregation/34049.html">Web框架在报告中以支持新的版本库和数据访问API,增强排序和过滤列表组件和一个新的用来呈现地理地图的组件,增强了交互性.旧的过时的代码已被删除,同时使用新的Java语言特性,如泛型. JasperReports是一个基于Java的开源报表工具,它可以在Java环境下像其它IDE报表工具一样来制作报表. JasperReport

JasperReports v4.0.0发布 基于Java的开源报表工具

JasperReports是一个基于Java的开源报表工具,它可以在Java环境下像其它IDE报表工具一样来制作报表. JasperReports 支持PDF.HTML.XLS.CSV和XML文件输出格式.JasperReports是当前Java开发者最常用的报表工具. 该版本引入了一个全新的 CSV 查询执行器,基于新的元数据的 CSV 导出工具,在其他方面也有一些改进和补丁修复:文档方面增加了一些新的章节. JasperReports的报告模板可以以iReport之类的工具来制作,只要把报告

基于Java的开源CMS系统选择(转)

  CMS概述 对于网站CMS系统而言,基于PHP的是主流,如Drupal/Joomla在各个主流虚拟机提供商上都是标准配置,也被广泛使用. 但如果你拥有Java团队,或者项目目标是想建立一个企业网使用的内容管理系统,那么选择一个基于Java的CMS系统就是合适的. 基于PHP的CMS系统和Java CMS,有一个显著的区别, 基于Java的CMS通常会把内容架构在JCR规范上,例如Jackrabbit,ModeShape, 而PHP的CMS直接架构在RDBMS规范上,主要是MySQL上.总体上

从理论到实践,基于Java的开源大数据工具

你也许会问,什么是大数据呢?最重要的是为什么它在每一个商业领域都是最新的趋势??这是一个炒作还是会继续发展?? 事实上,"大数据"是一个相当简单的术语,简单的说就是一个非常大的数据.有多大?答案是你无法想象. 这数据真的有如此大的规模吗?的确如此,因为这个数据无处不在.例如:用于收集天气信息的RFID传感器收集的天气信息,GPRS手机包,社交媒体网站的帖子,照片和视频,在线购买交易记录等等.大数据是一个巨大的数据可能包含我们感兴趣的每一个来源信息. 不过大数据不仅仅是简单的大小,相反大

山寨版Quartz.Net任务统一调度框架

TaskScheduler 在日常工作中,大家都会经常遇到Win服务,在我工作的这些年中一直在使用Quartz.Net这个任务统一调度框架,也非常好用,配置简单,但是如果多个项目组的多个服务部署到一台服务器时还是不尽如人意. 这段时间很忙,也一直未更新博客了,赶上今天下班早,就研究了一下,弄了个简单版基于Timer的山寨Quartz,当然了只是实现任务调度,闲话少说直接入主题吧 一.技术准备 其实都是普通的微软技术,一想到这方我们第一想到的可能就是反射,本文用了MEF   二.框架搭建 第一我们

9个基于Java的搜索引擎框架

在这个信息相当繁杂的互联网时代,我们已经学会了如何利用搜索引擎这个强大的利器来找寻目标信息,比如你会在Google上搜索情人节如何讨女朋友 欢心,你也会在百度上寻找正规的整容医疗机构(尽管有很大一部分广告骗子).那么如果在你自己开发的网站系统中需要能让用户搜索一些重要的信息,并且能以 结构化的结果展现给用户,下面分享的这9款Java搜索引擎框架或许就可以帮助到你了. 1.Java 全文搜索引擎框架 Lucene 毫无疑问,Lucene是目前最受欢迎的Java全文搜索框架,准确地说,它是一个全文检

超全!基于Java的机器学习项目、环境、库...

你是一名希望开始或者正在学习机器学习的Java程序员吗? 利用机器学习编写程序是最佳的学习方式.你可以从头开始编写算法,但是利用现有的开源库,你可以取得更大的进步. 本文介绍了主要的平台和开放源码的机器学习库.你可以使用这些机器学习库. 环境 本节描述了用于机器学习的Java环境或工作域.它们提供了用于执行机器学习任务的图形用户界面,还提供了用于开发自己应用程序的Java API. WEKA 怀卡托环境知识分析(Weka)( https:// www.cs.waikato.ac.nz/ml/we

Framer:JavaScript开源原型框架

Framer是一款基于http://www.aliyun.com/zixun/aggregation/33906.html">JavaScript的开源原型框架,可以帮助开发者及设计师轻而易举地创建出非常逼真的应用原型,还包括滤镜.弹性物理.完整的3D效果等.Framer能够同时应用于桌面和移动设备之上,通过它,开发者或设计师只需简单地创建图像.事件等模块即可构建和测试复杂的交互和动画. 使用Framer也是非常简单,在使用Photoshop设计好原型图之后,开发者及设计师可以直接使用Fr

Java线程池管理及分布式Hadoop调度框架搭建

多线程是程序员面试时常常会面对的问题,对多线程概念的掌握和理解水平,也常常被用来衡量一个人的编程实力.不错,普通的多线程已经不容易了,那么当多线程碰到"大象"又会产生什么样的火花?这里我们为大家分享上海创行科技技术总监严澜的博文--Java线程池管理及分布式Hadoop调度框架搭建. 平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发工程师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式框架