`

Quartz学习笔记(一)

    博客分类:
  • J2EE
阅读更多

Quartz特点

1) Quartz能嵌入到任何独立的应用中运行。 

2) Quartz能在应用服务器或者 Servlet 容器中实例化,并且能够参与 XA 事务。 

3) Quartz能够以独立的方式运行(在它自己的Java虚拟机中),可以通过 RMI使用

Quartz。 

4) Quartz可以被实例化为独立程序的集群(有负载均衡和容错能力)。 

Quartz功能介绍

任务执行(Job Execution

1) 任务是任何实现简单 Job 接口的 Java 类,这样开发者能够执行任何完成他们工作

的任务。

2) 任务类的实例可以由 Quartz实例化,也可以由你的程序框架实例化。

当触发器被触发时,日程管理器将会通知某个或者多个实现了JobListener 或 

TriggerListener的对象(监听器可以是简单的Java对象,或者 EJBs,或者 JMS 消息发布器,等等)。这些监听器在任务执行完毕后也会接到通知。

3) 任务被完成后,他们会返回一个“任务完成码(JobCompletionCode)”,这个

“任务完成码”告知日程管理器任务执行的结果是成功还是失败。日程管理器会根据成功或者失败码来采取措施,比如:立即重新执行任务

任务持久化(Job Persistence

1) Quartz设计中包括了一个JobStore接口,这样,实现这个接口的 Job多种机制实现Job 的存储。

2) 存储在数据库中:通过使用 JDBCJobStore,所有的 Jobs和 Triggers 被配置为“non-volatile(

轻快)的方式。即,通过 JDBC 存储在关系数据库中。

3) 存储在RAM中:通过使用 RAMJobStore,所有Jobs和 Triggers 被存储在 RAM。因此,在程序执行中没有被持久化,但这种方式的优点就是不需要外部数据库。

事务(Transactions

1) Quartz通过JobStoreCMTJDBCJobStore的一个子类)可参与 JTA 事务。

2) Quartz可以管理JTA (工作任务分析)事务(开始或者提交事务)。

集群(Clustering

1) Fail-over.(容错)

2) Load balancing.(负载均衡)

监听器及插件(Listeners & Plug-Ins

1) 应用可以通过实现一个或者多个监听器接口来实现捕捉日程事件,以监视或控制任务/触发器的行为。

2) 可以通过插件的机制来扩展 Quartz 的功能。例如:记录任务执行历史的日志,或者从文件中载入任务和触发器的定义。

3) Quartz自带了一些“factory built(内建)”的插件和监听器。

什么是Quartz

Quartz是一个任务日程管理系统,这个系统可以与任何其他软件系统集成或者一起

用。“任务进度管理器”就是一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。

Quartz相当“轻量”,并且需要非常少的步骤/配置,如果需求比较基本,Quartz确实非常容易使用。

Quartz具有容错性,并且可以在你系统重起的时候持久化(记住)被纳入日程的任务。

Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有 Quartz核心功能。这些功能的主要接口(API)Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。

如果你想将软件组件的执行纳入到日程中,它们只需简单地实现 Job 接口,这个接口有一个 execute()方法。如果希望在日程安排的时间到达时通知组件,那么这些组件应实现 TriggerListener或者 JobListener接口。

Quartz主过程可以在应用中启动或者运行,也可以作为一个独立的应用(带有RMI<远程服务接口>接口),或者在一个J2EE 应用服务器中运行,并且可作为其它 J2EE组件的一种引用资源。

Quartzjava.util.TimerJDK1.3起)的区别

1Java 定时器没有持久化机制。  

2Java 定时器的日程管理不够灵活(只能设置开始时间、重复的间隔,设置特定的日期、时间等)  

3Java 定时器没有使用线程池(每个Java 定时器使用一个线程)  

4Java 定时器没有切实的管理方案,你不得不自己完成存储、组织、恢复任务的措施。

夏令时和触发器

SimpleTrigger 总是每隔若干毫秒触发,而同夏令时没有关系。

CronTrigger 总是在给定的时间触发,然后计算它下次触发的时间。

开始使用Quartz

Job:接口:只有一个方法:oid execute(JobExecutionContext context)

JobDetailQuartz在每次执行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名称;

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

Calendarorg.quartz.Calendarjava.util.Calendar不同,它是一些日历特定时间点的集合(可以简 单地将org.quartz.Calendar看作java.util.Calendar的集合——java.util.Calendar代表一个日历时 间点,无特殊说明后面的Calendar即指org.quartz.Calendar)。一个Trigger可以和多个Calendar关联,以便排除或 包含某些时间点。

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,它类似于ServletContext,保存着Scheduler上下文信息,Job和 Trigger都可以访问SchedulerContext内的信息。SchedulerContext内部通过一个Map,以键值对的方式维护这些上下 文数据,SchedulerContext为保存和获取数据提供了多个put()和getXxx()的方法。可以通过Scheduler# getContext()获取对应的SchedulerContext实例

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

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

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

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

监听体系Quartz拥有完善的事件和监听体系,大部分组件都拥有事件,如任务执行前事件、任务执行后事件、触发器触发前事件、触发后事件、调度器开始事件、关闭事件等等,可以注册相应的监听器处理感兴趣的事件。

SimpleTrigger

SimpleTrigger拥有多个重载的构造函数,用以在不同场合下构造出对应的实例:

1) SimpleTrigger(String name, String group):通过该构造函数指定Trigger所属组和名称;

2 SimpleTrigger(String name, String group, Date startTime):除指定Trigger所属组和名称外,还可以指定触发的开发时间

3 SimpleTrigger(String name, String group, Date startTime, Date endTime, int repeatCount, long repeatInterval):除指定以上信息外,还可以指定结束时间、重复执行次数、时间间隔等参数;

4 SimpleTrigger(String name, String group, String jobName, String jobGroup, Date startTime, Date endTime, int repeatCount, long repeatInterval):这是最复杂的一个构造函数,在指定触发参数的同时,还通过jobGroupjobName,让该Trigger和 Scheduler中的某个任务关联起来。

CronTrigger

Quartz使用类似于Linux下的Cron表达式定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成,如表1所示:

分别代表秒、分钟、小时、日期、月份、星期、年

位置

时间域名

允许值

允许的特殊字符

1

0-59

, - * /

2

分钟

0-59

, - * /

3

小时

0-23

, - * /

4

日期

1-31

, - * ? / L W C 

5

月份

1-12

, - * /

6

星期

1-7

, - * ? / L C #

7

年(可选)

空值1970-2099

, - * /

Cron表达式的时间字段除允许设置数值外,还可使用一些特殊的字符,提供列表、范围、通配符等功能,细说如下:

1) 星号(*):可用在所有字段中,表示对应时间域的每一个时刻,例如,*在分钟字段时,表示“每分钟”;

2) 问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于点位符

3) 减号(-)表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12;

4) 逗号(,)表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五;

5) 斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。如在分钟字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可以使用*/y,它等同于0/y;

6) L:该字符只在日期和星期字段中使用代表“Last”的意思,但它在两个字段中意思不同。L在日期字段中,表示这个月份的最后一天,如一月的 31号,非闰年二月的28号;如果L用在星期中,则表示星期六,等同于7。但是,如果L出现在星期字段里,而且在前面有一个数值X,则表示“这个月的最后 X天”,例如,6L表示该月的最后一个星期五;

7) W:该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。例如15W表示离该月15号最近的工作日,如果该月15号是星 期六,则匹配14号星期五;如果15日是星期日,则匹配16号星期一;如果15号是星期二,那结果就是15号星期二。但必须注意关联的匹配日期不能够跨月,如你指定1W,如果1号是星期六,结果匹配的是3号星期一,而非上个月最后的那天。W字符串只能指定单一日期,而不能指定日期范围;

8) LW组合在日期字段可以组合使用LW,它的意思是当月的最后一个工作日

9) 井号(#):该字符只能在星期字段中使用,表示当月某个工作日。如6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个),而4#5表示当月的第五个星期三,假设当月没有第五个星期三,忽略不触发;

  10)  C:该字符只在日期和星期字段中使用代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于Quartz使用类似于Linux下的Cron表达式定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成

分享到:
评论

相关推荐

    Quartz学习笔记

    这个学习笔记将深入探讨Quartz的核心概念、主要功能以及如何在实际项目中使用它。 首先,我们要理解Quartz的基本架构。Quartz的核心组件包括Scheduler、Job、Trigger和Calendar。Scheduler是调度器,负责管理所有的...

    Quartz调度学习笔记

    Quartz 是一个强大的任务调度框架,由 OpenSymphony 开源组织开发,主要目的是提供一个用于在 Java 应用程序中安排任务执行的解决方案。Quartz 支持与 J2EE 和 J2SE 平台的无缝集成,允许开发者在各种类型的项目中...

    学习笔记_Quartz作业调度框架,使用corn表达式

    本学习笔记主要围绕Quartz的使用,特别是如何利用corn表达式来设置定时任务。 Quartz的核心概念包括Job(任务)、Trigger(触发器)和Scheduler(调度器)。Job是你要执行的实际业务逻辑,Trigger定义了Job何时被...

    Quartz入门学习(真丶入门)

    Quartz是一款开源的作业调度框架,它允许开发者创建和管理定时任务,以便在特定时间执行。在Java世界中,Quartz被广泛应用于...通过实践和学习,你将能够熟练掌握Quartz的使用,为你的项目带来更高效的自动化处理能力。

    Spring.NET学习笔记25——整合Quartz.NET例子

    刘冬编写Spring.NET学习笔记25——整合Quartz.NET例子。 原文: http://www.cnblogs.com/GoodHelper/archive/2009/11/20/SpringNet_QuartzNet.html

    quartz教程 quartz学习手册 quartz帮助手册

    六、Quartz学习资源 本教程、学习手册和帮助手册将详细阐述Quartz的各个方面,从基本使用到高级特性的实践,帮助开发者从初学者到精通者。通过阅读这些资料,你可以掌握如何在项目中有效地使用Quartz,提升系统的...

    Quartz1.8任务进程管理系统学习笔记一:版本1.8和之前版本的不同

    NULL 博文链接:https://jaykuen.iteye.com/blog/911106

    SpringBoot学习笔记完整教程

    Spring Boot 是一个基于 Spring 框架的快速开发...这个完整的 Spring Boot 学习笔记涵盖了从基础到进阶的各个方面,通过学习和实践,你可以掌握 Spring Boot 开发的核心技能,从而高效地构建高质量的 Java 后端应用。

    学习笔记 MHT2

    【学习笔记 MHT2】是一份综合性的IT学习资料,主要涵盖了JavaScript编程、软件开发工具、Web服务器技术、编码解码方法以及设计模式等多个领域的知识。以下是对这些知识点的详细阐述: 1. **JavaScript经典技巧**:...

    spring2.0学习笔记+spring定时任务

    标题中的“spring2.0学习笔记+spring定时任务”表明了这个压缩包文件包含的是关于Spring框架2.0版本的学习资料,特别是关于Spring的定时任务功能。Spring是Java开发中最广泛应用的轻量级框架之一,它提供了一整套...

    objective-c学习笔记

    学习笔记中可能包含了一些关于Objective-C图形编程的内容,如Core Graphics或Quartz 2D,它们是苹果平台进行低级绘图的API,可用于创建自定义视图和复杂的图形。 六、实践应用 理论学习后,通过编写简单的iOS应用...

    spring学习笔记

    这个“spring学习笔记”包含了与Spring框架相关的源代码和项目实践,旨在帮助学习者深入理解并掌握Spring的核心概念和技术。 首先,Spring的核心特性之一是依赖注入(Dependency Injection, DI),它允许开发者通过...

    Spring学习笔记(内含代码)

    这个“Spring学习笔记(内含代码)”包含了作者在深入研究Spring框架过程中所做的详细记录,旨在帮助初学者和有经验的开发者更好地理解和应用Spring。 Spring框架的核心特性包括依赖注入(Dependency Injection,DI...

    SpringBoot 学习笔记完整教程

    SpringBoot学习笔记完整教程 SpringBoot是Spring框架的一个简化版,旨在简化Spring应用程序的初始设置和开发过程。它集成了大量的常用库,如数据访问、安全、Web等,使得开发者可以快速构建健壮的微服务应用。本...

    Directshow(SDK)学习笔记

    DirectShow(SDK)是微软提供的一套用于Windows平台上的流媒体处理工具,它与DirectX一同发布。这个SDK主要用于多媒体数据的捕获、处理和回放,支持多种媒体格式,如Asf、Mpeg、Avi、Dv、Mp3、Wave等。DirectShow...

    springboot+quartz多任务

    Quartz则是一个强大的开源作业调度库,用于在Java应用中执行定时任务。本资源结合了Spring Boot与Quartz,提供了在Spring Boot环境中实现多任务调度的解决方案。 首先,我们需要了解Spring Boot的核心特性。Spring ...

Global site tag (gtag.js) - Google Analytics