Quartz Job Scheduling Framework[翻译]- 中文版 CHM 文件发布

Quartz Job Scheduling Framework_2.jpg Quartz Job Scheduling Framework 中 文 版

Chuck Cavaness 著 Unmi(隔叶黄莺) 译

译者博客:http://unmi.cc/

下载地址:Quartz Job Scheduling Framework 中文版.chm

写在最前面的

以此篇权当译者序。再次翻看一下我的博客,最早的那篇《Quartz Job Scheduling Framwork》翻译是在 2007-10-17 02:17 ,距离今日那是一个造人的时间,足见这个翻译过程有多难产。一方面是源于语言水平,再者其间也发生了许多事情。

Quartz 是什么,大概不需多加说明,简单讲就是一个纯 Java 实现的作业调度工具,相当于数据库中的 Job、Windows 的计划任务、Unix/Linux 下的 Cron,但 Quartz 可以把排程控制的更精细。也许大多数人听说 Quartz 是在学习或使用 Spring 的时候,也就是 Spring 整合了 Quartz。而我也不例外,同样是在春天里得悉了这块石英。

当初公司一个项目中有些定时候任务,原来是用 JDK 的 TaskTimer 来实现的,个人觉得比较笨拙--未能跳开节假日,也不能依赖于其他的业务操作灵活安排计划。于是想起了 Spring 框架整合了一个作业调度框架 Quartz,其实一直没用过它,而且这回是要脱离 Spring 框架来使用 Quartz。于是就到网上找来 Quartz 相关的资料,介绍使用倒也不含糊,但缺乏系统与深度,继而找到的就是这本英文版的《Quartz Job Scheduling Framework》。

起初对它的翻译不过是一时之兴--反正都是阅读,何妨用文字再次转录下来呢?后来发现对英文的阅读和翻译全然不是那么一回事,有太多的磕磕碰碰,那是对两种语言的双重考验。阅读可以是眼观六路,一知半解的,完全转换成中文就要字句斟酌,有时候还得为音韵的抑扬顿挫考究了起来。

数篇之后,确实觉得很耗时间且无用功太多,但又不想虎头蛇尾,感情上也无法割舍,加之有各位同仁网友的鼓励与期盼,使我紧持了下来。到目前为止,该书除前言部分、配置参考及附录未翻译之外,主体内容的翻译已大功告成。也算是基本了却了一桩心愿,当然对于落下的几小部分还会补充进来。

现把本人博客上零零散散,顺序错乱的各篇译章汇集成册,做成了一个 《Quartz Job Scheduling Framework 中文版.chm 》文件与各位分享,以方便大家的阅读。同时感谢大家一路来的支持,也希望大家能提出宝贵意见,或有问题拿出来共同探讨。另外,每篇译章都有到达我的博客上所对应页面的链接,所以若有疑问可点击页面上方或下方的的 comment.jpg 按钮进入到博客对应页面来对本篇进行评论,或阅读他人的相关评论

说明一下的是,由于本 CHM 文件是直接通过博客上相应日志来自动生成的,所以博客上日志内容有修改也能很快反映到《Quartz Job Scheduling Framework 中文版.chm》中,弊端是未能与原版 CHM 文件的章节目录保持一致,优点是能及时让 CHM 文件与博客日志的内容保持同步,也方便于阅读时就某一篇章共同探讨。

现如今虽有电脑自动全文翻译,而且比较智能化了,为何还去人工翻译呢?电脑总缺少人性化,许多地方无法到位,二来也为了锻练自己。实际上,在对 《Quartz Job Scheduling Framework》的翻译过程所能获得的好处也是不言而喻的。主要表现在两方面:

1. 对技术把握的更精细。阅读是放眼而瞟,只求个大概;翻译则不同,本身未能理解个相当,何以能用中文向他人解译的清楚呢?不得蕴责任于其中。对于多数例子,并非照搬了事,都有再次测试感受过的。译章置于网上之后,亦有许多朋友就 Quartz 提出疑问,毕竟文字出自我手,也就当仁不让的尽我能作出解答,也非常有助于自身对该项技术的掌握。

2. 阅读与翻译的速度提升也是显而易见的。最初时的每字每句的爬梳,须频繁请求各方资源才能完成一篇,现在与那时相比,可谓顺畅多了。许多篇章纵使离开英文词典也无碍了。以后的前行中需要面对更多的英文资料,通过对 Quartz 这个手册翻译算是好好锤炼了自己的英文阅读能力,写作能力亦在其内。

如果,除了诸位同仁网友的鼓励与期盼要感谢之外,以及他们在仔细品读后发现的许多错误之处,才得已使此译者更趋完美,同时非常感激他们阅读每一篇章的态度,这些可以在博客上的评论看得到;那么还要感谢的就是那些飘洒着过早离我而去的头发,曾经多少个夜晚,是我让你们迟迟不能进入到本该属于你们的色彩当中去,所以才不得不选择舍我而去。

此外,版权属于原作者和原出版社,本人对本书的翻译只为个人的兴趣,仅限于学习与交流,不用于任何商业目的。

类别: Quartz. 标签: , . 阅读(3,451). 订阅评论. TrackBack.

Leave a Reply

122 Comments on "Quartz Job Scheduling Framework[翻译]- 中文版 CHM 文件发布"

avatar
zeek
Guest
zeek

翻译是quartz的哪个版本?目前最新的quartz是2.2.x,此书还试用吗?

Yanbin
Guest
Yanbin

跳过吧,已经不太适用了

guest
Guest
guest

博主有没有英文原文

李晨亮
Guest

爱死了,真想狠狠的亲一口作者,以表谢意!

Anyz
Guest
Anyz

我想问一下:项目中不是每隔多长时间执行某项任务,任务的执行是由系统中某项操作驱动的(比喻说:用户在系统中要建一座房子,点击下按钮就可以了,但房子并不是马上就出现或建好,建房子的周期是10天,也就是10天后房子就自动出现了,并且弹出提示消息。)
问:这样怎么配置时间?感谢!

七月先知
Guest

感谢分享,正需要这方面的资料。请问英文版的在哪找?

ucooper
Guest

楼主辛苦!

火星的青蛙
Guest
火星的青蛙

支持一下!!

火星的青蛙
Guest
火星的青蛙

我想问下 如果我使用自定义数据库去存job trigger等信息的话 那么是不是每次得写个插件去监控数据库 发现一添加新任务 就把它进行实例化添加到当前的scheduler中呢?

火星的青蛙
Guest
火星的青蛙

如果一个触发器定的是每5分钟执行一次JOB,但是,如果这个JOB在上一次执行超过了5分钟,那就是在下一次触发点时候这个任务还没执行完,那么怎么办?该如何控制?如果需要执行则怎么控制?如果不需要执行又该怎么控制呢?

火星的青蛙
Guest
火星的青蛙

不错的资源!谢谢啦,以后多多交流哦!

YODA
Guest

老兄,辛苦了!敬佩你的精神。

下次再有这样的好事儿,叫上兄弟一起啊,只要你不怕我添乱就行,呵呵

PetrusXu
Guest
PetrusXu

@隔叶黄莺

OK ,搞定了,
不胜感激,谢啦

隔叶黄莺
Guest

By default Scheduler locate the quartz.properties according to the value of a system property, the key is "org.quartz.properties", so you can add this system property before getting Scheduler instance, such as

System.setProperty("org.quartz.properties","\config\quartz.properties");

Or as a command argument:

-Dorg.quartz.properties=\config\quartz.properties;

StdSchedulerFactory will execute new File(propFileName) to load file, you can use a absolute or a relative file path that you prefer.

Good luck.

PetrusXu
Guest
PetrusXu

兄台,问个东西,

最近公司一个项目上要添加“自动服务”功能,
我现在选择了quartz,基本上差不多了。
但是,有一个问题没法解决。

就是关于配置文件“quartz.properties”,必需放置在classpath路径中,
这个,我这个项目就有点问题了,
我们这边规定,配置文件同意放置在“\config”路径下,
因为之前都是手动加载的(xml文件通过jdom),

这个quartz因为是开源的,当在classpath中有新的“quartz.properties”时,它自动会加载。
但是,现在能不能有什么方法,让我读取“\config\quartz.properties”这个文件呢,首先,没有把它加载到classpath里面。

类似于“log4j”,
在“log4j”中可以通过“org.apache.log4j.PropertyConfigurator.configure(String log4jfile);”
指定“\config\log4j.properties”配置文件 ,这里 log4jfile = “\config\log4j.properties”。
请问一下,quartz是否也提供了类似log4j中“PropertyConfigurator”这个类的功能, 即手动载入配置文件

谢谢

见习和尚
Guest
见习和尚

up~~~~

abby
Guest

我觉得中国,有你值得骄傲!

@beyondwcm
Guest
@beyondwcm

辛苦

蒋家狂潮
Guest

非常不错,本人就是用你翻译后的文档做参考

szl
Guest
szl

辛苦呀

jacky
Guest
jacky

辛苦了

yangqiushi
Guest
yangqiushi

非常感谢啊!!!

隔叶黄莺
Guest

@杰克

对的,这是 quartz 本身的一个 Bug,我在该日志http://www.blogjava.net/Unmi/archive/2007/11/17/159830.html#210032 的评论中有所论述,请进入这个链接看看。

杰克
Guest
杰克

使用3.8的配置文件quartz_jobs.xml会发生无法解析触发器启动时间的错误。
要转成这样格式【2009-12-08T11:15:00】才行,不知道是不是旧版本不支持了。

爱上对方
Guest
爱上对方

楼主你快转个pdf出来吧,我读你的网页和chm都是字体错乱的。受不了啦。

路过
Guest
路过

真的很不错

黄土高坡
Guest

谢谢楼主,辛苦了!支持!

cai
Guest
cai

支持!

zhaoh
Guest
zhaoh

非常感谢

网络兼职
Guest

很不错的博客!!!

文
Guest

向你致敬

fhway
Guest

非常感谢!

枫少
Guest
枫少

真的很感谢楼主。。

刘大伟
Guest

谢谢

lhx1026
Guest
lhx1026

@lhx1026
唉,写错了。。。。是楼主好伟大呀。。。。

lhx1026
Guest
lhx1026

辛苦了,谢谢Lz。。。楼主要伟大呀。。。

鮑佩
Guest

谢谢隔叶黄莺,因为你的翻译,我受益了。。。

gueizi
Guest
gueizi

谢谢啊,十分感谢

kinjo
Guest
kinjo

辛苦了,谢谢LZ

zhanngle
Guest
zhanngle

楼主辛苦了!

敬礼!

隔叶黄莺
Guest

@Tenny

看看 JobStoreSupport.getConnection() 方法的返回值是什么,注意它所在的包,及所实现的接口,是否和方法的原意相符。直接的,看你连接是什么数据库,换个驱动试试。

Tenny
Guest
Tenny

Unmi:

当某个Job在执行,突然碰到突发事件,如宕机,那么正在执行的Job会丢失,其他没执行的Job在下次重新启动时还能正常执行,实际上正在执行的Job并没有执行完成,我通过插入数据到数据库来验证的,在数据库中相关Job的状态却被置为"已完成"了.这是不是事务机制没处理好,还是我的事务管理没有配置好?

Tenny
Guest
Tenny

配置Quartz1.6 时org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreCMT 方式老报错:

请帮我检查一下quartz.properties文件:

org.quartz.scheduler.instanceName = OnlineTaskQuartzScheduler

org.quartz.scheduler.instanceId = AUTO

org.quartz.threadPool.threadCount = 1

org.quartz.threadPool.threadPriority = 5

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreCMT

org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate

org.quartz.jobStore.dataSource = ReportDataSource (此ReportDataSource为weblogic配置jndi名称)

org.quartz.jobStore.tablePrefix = QRTZ_

org.quartz.jobStore.isClustered = true

org.quartz.jobStore.nonManagedTXDataSource = myDS (这个只是在这里起的名字,在Weblogic中没有对应的DS配置)

org.quartz.dataSource.myDS.driver = oracle.jdbc.driver.OracleDriver

org.quartz.dataSource.myDS.URL = jdbc:oracle:thin:@192.168.0.12:1521:dhcs

org.quartz.dataSource.myDS.user = anareport

org.quartz.dataSource.myDS.password = anareport

org.quartz.dataSource.myDS.maxConnections = 20

org.quartz.dataSource.myDS.validationQuery = select table_name from user_tables

org.quartz.dataSource.ReportDataSource.jndiURL = ReportDataSource (此ReportDataSource为weblogic配置jndi名称)

org.quartz.dataSource.ReportDataSource.jndiAlwaysLookup = DB_JNDI_ALWAYS_LOOKUP

org.quartz.dataSource.ReportDataSource.java.naming.factory.initial = weblogic.jndi.WLInitialContextFactory

org.quartz.dataSource.ReportDataSource.java.naming.provider.url = t3://localhost:7001

org.quartz.dataSource.ReportDataSource.java.naming.security.principal = weblogic

org.quartz.dataSource.ReportDataSource.java.naming.security.credentials = weblogic

Tenny
Guest
Tenny

系统报错如下:

2009-3-19 21:00:51 org.apache.catalina.core.StandardWrapperValve invoke

严重: Servlet.service() for servlet action threw exception

org.quartz.JobPersistenceException: Failed to obtain DB connection from data source 'ReportDataSource': java.lang.IncompatibleClassChangeError: Implementing class [See nested exception: java.lang.IncompatibleClassChangeError: Implementing class]

org.quartz.impl.jdbcjobstore.JobStoreSupport.getConnection(JobStoreSupport.java:640)

org.quartz.impl.jdbcjobstore.JobStoreCMT.executeInLock(JobStoreCMT.java:234)

org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInLock(JobStoreSupport.java:3586)

org.quartz.impl.jdbcjobstore.JobStoreSupport.storeJobAndTrigger(JobStoreSupport.java:971)

org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:703)

org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:255)

java.lang.IncompatibleClassChangeError: Implementing class

at java.lang.ClassLoader.defineClass1(Native Method)

at java.lang.ClassLoader.defineClass(ClassLoader.java:620)

at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)

at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:476)

at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:181)

at java.lang.ClassLoader.loadClass(ClassLoader.java:306)

at java.lang.ClassLoader.loadClass(ClassLoader.java:251)

at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:223)

at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

at java.lang.ClassLoader.defineClass1(Native Method)

at java.lang.ClassLoader.defineClass(ClassLoader.java:620)

at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)

at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:476)

at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:181)

at java.lang.ClassLoader.loadClass(ClassLoader.java:306)

at java.lang.ClassLoader.loadClass(ClassLoader.java:251)

at weblogic.utils.classloaders.GenericClassLoader.findOrCreateSingleSourceClass(GenericClassLoader.java:640)

at weblogic.rmi.internal.StubGenerator.getStubOnClient(StubGenerator.java:789)

at weblogic.rmi.internal.StubGenerator.getStubClass(StubGenerator.java:765)

at weblogic.rmi.internal.StubGenerator.generateStub(StubGenerator.java:810)

at weblogic.rmi.internal.StubGenerator.generateStub(StubGenerator.java:797)

at weblogic.rmi.extensions.StubFactory.getStub(StubFactory.java:79)

at weblogic.rmi.utils.io.RemoteObjectReplacer.resolveObject(RemoteObjectReplacer.java:237)

at weblogic.rmi.internal.StubInfo.readResolve(StubInfo.java:142)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:585)

at java.io.ObjectStreamClass.invokeReadResolve(ObjectStreamClass.java:1006)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1722)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)

at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1912)

at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1836)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)

at weblogic.common.internal.ChunkedObjectInputStream.readObject(ChunkedObjectInputStream.java:120)

at weblogic.rjvm.MsgAbbrevInputStream.readObject(MsgAbbrevInputStream.java:117)

at weblogic.rmi.internal.ObjectIO.readObject(ObjectIO.java:56)

at weblogic.rjvm.ResponseImpl.unmarshalReturn(ResponseImpl.java:159)

at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:285)

at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:244)

at weblogic.jdbc.common.internal.RmiDataSource_922_WLStub.getConnection(Unknown Source)

at org.quartz.utils.JNDIConnectionProvider.getConnection(JNDIConnectionProvider.java:160)

at org.quartz.utils.DBConnectionManager.getConnection(DBConnectionManager.java:112)

at org.quartz.impl.jdbcjobstore.JobStoreSupport.getConnection(JobStoreSupport.java:633)

at org.quartz.impl.jdbcjobstore.JobStoreCMT.executeInLock(JobStoreCMT.java:234)

at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInLock(JobStoreSupport.java:3586)

at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeJobAndTrigger(JobStoreSupport.java:971)

at org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:703)

at org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:255)

隔叶黄莺
Guest

to 楼上:

回复中相应章节对应的日志中,请见:

http://www.blogjava.net/Unmi/archive/2008/04/30/197391.html#Post

黑骑士
Guest
黑骑士

请问在您的Quartz Job Scheduling Framework的第十三章讲到的web工程里需要引用一个import org.cavaness.jobconsole.web.QuartzFactoryServlet;包,也就是 StdSchedulerFactory factory =

(StdSchedulerFactory)

ctx.getAttribute(

QuartzFactoryServlet.QUARTZ_FACTORY_KEY); 这段代码所需要的包在哪里可以找到,我下的quartz-1.6.4里没有呀,麻烦楼主有的话给发个呗,谢谢了,急用!zzcourage.@126.com

zhujianf
Guest
zhujianf

辛苦了,非常感谢

易通中国
Guest

学习并研究Linux,Apache,MySQL,PHP,C语言,Perl语言,Zend Framework,MVC,Jquery

--etongchina的博客 欢迎您的到来!

兄弟,可否交换链接?

ll
Guest
ll

挺佩服的,文章和人,both!

zhouzhou
Guest

谢谢隔页黄莺,真的很辛苦