官网:
http://www.quartz-scheduler.org
Java文档(重要):
http://www.quartz-scheduler.org/api/previous_versions/2.0.2/index.html
GitHub:
https://github.com/quartz-scheduler/quartz
Quartz Job是项目开发中经常用到的第三方开源Jar,由James House创建并于2001年初加入到SourceForge下)。
因为Job大家都比较熟悉,就不具体讲例子,就讲下实际应用中碰到的问题吧。
1.基本接口类(核心)介绍
Scheduler
Job
JobDetail
Trigger
JobBuilder
TriggerBuilder
其中Scheduler, Job, Trigger都可以配置在xml文件中。
2.怎样理解Sheduler拥有的线程池
Scheduler本身就是一个容器,它维护着Quartz的各种组件并实施调度的规则。Scheduler还拥有一个线程池,线程池为任务提供执行线程――这比执行任务时简单地创建一个新线程要拥有更高的效率,同时通过共享节约资源的占用。通过线程池组件的支持,对于繁忙度高、压力大的任务调度,Quartz将可以提供良好的伸缩性。
我们可以在scheduler初始化时设定tread的数量,比如5个线程。那么如果我们配置一个Job,并让这个Job每秒执行1次,然而这个Job实现类里如果要执行10秒(等待),那么执行的结果顺序会是怎样呢?会变成每10秒执行一次吗?
在第1个Job启动后,第2个Job隔1秒还是会执行,直到第5个Job被执行,然后才是等待。原因是Scheduler会用线程池去管理Job,这个跟其设定的Thread数量有关。
3.可持久化的Job
这个算是Quartz Job的特点之一。Quartz包含了一个叫JobStore的接口。其中JDBCJobStore和RAMJobStore都是其实现类,JDBCJobStore中的job和trigger都配置在数据库中(Quartz会在其配置的数据库中创建一系列的表),而RAMJobStore是将job等信息存放在内存中。
其利弊是,JDBCJobStore因为要和数据库进行交互,必然效率上是比不上RAMJobStore,但其优点是job等信息不会随着程序的重启而丢失(对于Misfire的情况可以配置策略,比如重启后再继续执行Job等)。
多说一句,对于JDBCJobStore之前有碰到的一个误区。我们的项目是有多个节点(负载均衡)的,那么有时候要执行一个Job,只需同一时间点上在其中的一台node上执行,而默认的scheduler执行是跟Thread有关,跟Node并没有关系。之前的误解是以为配置了JDBCJobStore就可以了,其实这样并不能阻止多个Node一起执行一个Job。
JDBCJobStore的核心是将Job信息存放在数据库中,但这跟Job被实例化了多少次并没有多少关系。(被实例多少次是由Scheduler的线程池控制的)
在Quartz 1.8版本有个接口叫StatefulJob,这个接口在2.0版本被两个Annotation代替,即:@PersistJobDataAfterExecution和@DisallowConcurrentExecution。
而我上述的需求就是要阻止Job在同一时间被多次实例化,即需要配置@DisallowConcurrentException。
另外,@PersistJobDataAfterExecution的作用是告诉Quartz在成功执行了一个Job后,更新JobDetail中的JobDataMap数据,使得该job(即JobDetail)在下一次执行的时候,JobDataMap中是更新后的数据,而不是更新前的旧数据。
4.与Spring结合
一个Job在继承Quartz Job接口后,就可以在其execute方法里写业务逻辑了。但是默认情况下该Job取不到Spring的上下文(即Bean)。解决办法可以是手动通过ApplicationContext取到相应的Bean或是把Quartz配置到Spring的Context里。
分享到:
相关推荐
文件里面包括 1:Quartz开发指南.pdf 2:Quartz从入门到进阶.pdf 3:QuartzBeginnerExample一个附带的工程例子 4:quartz-1.6.1.zip Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它...
quartz简单实例quartz简单实例quartz简单实例quartz简单实例
赠送jar包:quartz-2.3.2.jar; 赠送原API文档:quartz-2.3.2-javadoc.jar; 赠送源代码:quartz-2.3.2-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.2.pom; 包含翻译后的API文档:quartz-2.3.2-javadoc-API...
该压缩包内包含两个quartz的jar包, 分别是quartz-1.6.0.jar和quartz-all-1.6.0.jar
quartz-2.2.3版本的quartz初始化sql语句
赠送jar包:quartz-2.3.0.jar; 赠送原API文档:quartz-2.3.0-javadoc.jar; 赠送源代码:quartz-2.3.0-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.0.pom; 包含翻译后的API文档:quartz-2.3.0-javadoc-API...
lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子
Quartz调度框架应用总结
Quartz1.5,Quartz1.6,Quartz1.8。Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个...
quartz quartz-1.8.6 dbTables quartz动态任务调度需要的数据库脚本。
Quartz使用方法Quartz使用方法Quartz使用方法Quartz使用方法Quartz使用方法
Quartz.NET框架的核心是调度器。调度器负责管理Quartz.NET应用运行时环境。Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz.NET采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器...
quartz内部表.sql。
Quartz原理及实例,spring4.x+Quartz.2.2.1结合的开发,静态和动态实例
quartz 时间配置规则quartz 时间配置规则quartz 时间配置规则quartz 时间配置规则quartz 时间配置规则quartz 时间配置规则
quartz-job数据库初始化表一些表结构整理
NULL 博文链接:https://fanshuyao.iteye.com/blog/2392350
在 myeclipse6.0.1下调试成功可直接运行的spring的quartz的例子,很适合刚接触quartz调度学习。
Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架内一些非常重要的部件。 Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的...
quartz-2.2.1 最新包