`

了解Quartz体系结构

阅读更多

了解Quartz体系结构

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

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

●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名称;

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

●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、WeeklyCalendar分别针对每年、每月和每周进行定义;

●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实例;

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

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

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

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

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

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


1 Cron表达式时间字段

 

位置

时间域名

允许值

允许的特殊字符

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

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

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

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

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

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

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

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

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

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

● C:该字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。

Cron表达式对特殊字符的大小写不敏感,对代表星期的缩写英文大小写也不敏感。

分享到:
评论

相关推荐

    Job 任务介绍

    #### 了解Quartz体系结构 Quartz 是一款强大的开源任务调度框架,自2001年发布以来,已经被广泛应用于各种企业级应用中,以解决任务调度的问题。它不仅具备高度的灵活性,同时也保持着相对简单的使用方式,能够满足...

    Quartz定时器介绍与简单使用

    #### 1.3 Quartz体系结构 Quartz 的体系结构主要由以下三个核心组件构成: - **调度器 (Scheduler)**: 作为作业的总指挥,负责管理所有的作业和触发器,并控制它们的执行流程。 - **触发器 (Trigger)**: 作为作业...

    Quartz.NET定时任务例子源代码(C#)

    在本案例中,"Quartz.NET定时任务例子源代码(C#)" 提供了一个使用C#语言实现的Quartz.NET应用示例,帮助开发者了解如何在实际项目中运用该库。 首先,`MyQuartz.sln` 是Visual Studio的解决方案文件,包含了整个...

    quartz教程

    #### 二、Quartz的核心概念与体系结构 Quartz的设计围绕三个核心概念展开:**调度器(Scheduler)**、**任务(Job)** 和 **触发器(Trigger)**,它们共同构建了一个高效且灵活的任务调度机制。 - **Job(任务)**:这...

    Spring+3.x企业应用开发实战光盘源码(全)

     第5章:对Spring容器进行解构,从内部探究Spring容器的体系结构和运行流程。此外,我们还将对Spring容器一些高级主题进行深入的阐述。  第6章:我们从Spring AOP的底层实现技术入手,一步步深入到Spring AOP的...

    cleanarchitecture:清洁建筑+弹簧+石英

    在干净的体系结构中,核心是实体。 就我而言,我将实体放在核心程序包中的程序包中。 这些实体将在用例中使用。 就我而言,我的实体通过数据提供者间接在用例WhatsTheTime.java中使用。 注意,用例中使用的那些...

    学习Java语言的30个参考,让你坐拥别人之上的30个擦考

    - **类加载器体系结构**:认识Bootstrap ClassLoader、Extension ClassLoader、Application ClassLoader的区别和作用。 - **类的生命周期管理**:掌握类的卸载条件和时机。 ### 4. GUI开发 - **Applet基础知识**:...

    基于springboot的教学资源库源码数据库.zip

    《基于SpringBoot的教学资源库源码数据库》是一个典型的Java Web项目,主要采用了SpringBoot框架,结合SSM(Spring、SpringMVC、MyBatis)体系结构,为教学资源的管理和分享提供了一个高效、便捷的平台。这个源码库...

    陈开雄 Spring+3.x企业应用开发实战光盘源码.zip

     第5章:对Spring容器进行解构,从内部探究Spring容器的体系结构和运行流程。此外,我们还将对Spring容器一些高级主题进行深入的阐述。  第6章:我们从Spring AOP的底层实现技术入手,一步步深入到Spring AOP的...

    JAVA技术体系

    ### JAVA技术体系 #### Java 技术概览 Java 是一种广泛使用的计算机编程语言,具有简单性、面向对象、健壮性、安全性、平台独立性等特点。Java 的核心技术包括 Java Standard Edition (Java SE),Java Enterprise ...

    Velcro二次开发SDK帮助文档

    - **jboss目录结构说明**:了解JBoss服务器的目录结构对于部署和调试应用程序非常重要,特别是了解部署应用程序的具体位置。 #### 三、Velcro系统体系介绍 - **3.1 系统模块关系**:Velcro系统由多个模块组成,每个...

    java学习中的一点忠告

    掌握RMI(远程方法调用)、RMI/IIOP等远程API,以及CORBA(公共对象请求代理体系结构),可以实现不同平台之间的服务互操作,这对于构建分布式系统尤为关键。 ### 七、Java EE标准与Web容器 熟悉Java EE标准,包括...

    Java高手的25个学习要点.txt

    而CORBA(Common Object Request Broker Architecture)则是一种面向对象的服务体系结构,支持异构环境下的对象通信。 #### 12. 学习XML相关的API如JAXP、JDOM等。 随着XML成为数据交换的标准格式,掌握如何解析和...

    Spring.3.x企业应用开发实战(完整版).part2

    1.4 Spring体系结构 1.5 Spring 3.0的新功能 1.5.1 核心API更新到Java 5. 1.5.2 Spring表达式语言 1.5.3 可通过Java类提供IoC配置信息 1.5.4 通用类型转换系统和属性格式化系统 1.5.5 数据访问层新增OXM功能 1.5.6 ...

    Spring3.x企业应用开发实战(完整版) part1

    1.4 Spring体系结构 1.5 Spring 3.0的新功能 1.5.1 核心API更新到Java 5. 1.5.2 Spring表达式语言 1.5.3 可通过Java类提供IoC配置信息 1.5.4 通用类型转换系统和属性格式化系统 1.5.5 数据访问层新增OXM功能 1.5.6 ...

    Java开发典型模块大全(仅含程序源码)-20个Java项目

    2. **数据结构与算法**:可能包含链表、栈、队列、树、图等数据结构的实现,以及排序、查找等常见算法。了解和熟练运用这些将提升编程效率和代码质量。 3. **IO流与NIO**:Java的IO流体系包括字节流、字符流,以及...

    学习spring时的笔记

    【Spring 体系结构】 Spring框架主要包含核心容器、数据访问/集成、Web、AOP、工具和其他模块。核心容器是核心,包含beans、core、context和expression等子模块。 【入门案例:IoC】 1. **导入jar包**:为了使用...

    JFinal资源

    - JFinal的插件丰富,例如Shiro安全框架插件、Swagger API文档生成插件、Quartz定时任务插件等,可以帮助开发者快速实现特定功能。 7. **实际应用场景** - JFinal适用于中小型Web项目,尤其适合个人开发者或者小...

    java大众点评讲师源码

    大众点评是中国知名的本地生活服务平台,其背后的技术体系涉及到大量的Java技术应用。作为讲师源码,这可能是一份用于教学或培训的代码库,帮助学员理解和学习如何在实际项目中运用Java技术。 首先,Java是一种广泛...

    即开即用的基于SpringBoot的后台管理系统脚手架,已集成权限管理,文件上传,定时任务,邮件中心,监控中心等模块.zip

    综上所述,这个压缩包可能包含了一个完整的后台系统结构,开发者可以通过解压后快速启动项目,然后根据自身需求进行定制和扩展。文件名称"ahao2"可能是项目主模块或者启动脚本,具体功能需要查看源代码才能了解。在...

Global site tag (gtag.js) - Google Analytics