附录 A. Quartz 配置参考
本附录编写作为配置一个 Quartz 应用的快速参考。尽管这些信息在 Quartz 文档中都有,但是这个附录提供了一种更快的方式来查找配置属性和它们可能的值。
一. 主要的 Quartz 属性
表 A.1 列出了主要的 Scheduler 属性。它们用于声明和标识 Scheduler 和其他高层次的设置。
名称 | 必须 | 类型 | 默认值 | |
org.quartz.scheduler.instanceName | 否 | String | 'QuartzScheduler' | |
org.quartz.scheduler.instanceId | 否 | String | 'NON_CLUSTERED' | |
org.quartz.scheduler.instanceIdGenerator.class | 否 | String | org.quartz.simpl.SimpleInstanceIdGenerator | |
org.quartz.scheduler.threadName | 否 | String | instanceName+'_QuartzSchedulerThread' | |
org.quartz.scheduler.idleWaitTime | 否 | Long | 30000 | |
org.quartz.scheduler.dbFailureRetryInterval | 否 | Long | 15000 | |
org.quartz.scheduler.classLoadHelper.class | 否 | String | org.quaartz.simpl.CascadingClassLoadHelper | |
org.quartz.context.key.SOME_KEY | 否 | String | None | |
org.quartz.scheduler.userTransactionURL | 否 | String | 'java:comp/UserTransaction' | |
org.quartz.scheduler.wrapJobExecutionIn UserTransaction |
否 | Boolean | false | |
org.quartz.scheduler.jobFactory.class | 否 | String | org.quartz.simple.SimpleJobFactory |
·org.quartz.scheduler.instanceName
每个 Scheduler 必须给定一个名称来标识。当在同一个程序中有多个实例时,这个名称作为客户代码识别是哪个 Scheduler 而用。假如你用到了集群特性,你就必须为集群中的每一个实例使用相同的名称,以使它们成为“逻辑上” 是同一个 Scheduler 。
·org.quartz.scheduler.instanceId
每个 Quartz Scheduler 必须指定一个唯一的 ID。这个值可以是任何字符串值,只要对于所有的 Scheduler 是唯一的。如果你想要自动生成的 ID,那你可以使用 AUTO 作为 instanceId。从版本 1.5.1 开始,你能够定制如何自动生成实例 ID。见 instanceIDGenerator.class 属性,会在接下来讲到。
·org.quartz.scheduler.instanceIdGenerator.class
从版本 1.5.1 开始,这个属性允许你定制instanceId 的生成,这个属性仅被用于属性 org.quartz.scheduler.instanceId 设置为 AUTO 的情况下。默认是 org.quartz.simpl.SimpleInstanceIdGenerator,它会基于主机名和时间戳来产生实例 ID 的。
·org.quartz.scheduler.threadName
可以是对于 Java 线程来说有效名称的任何字符串。假如这个属性未予指定,线程将会接受 Scheduler 名称 (org.quartz.scheduler.instanceName) 前附加上字符串 '_QuartzSchedulerThread' 作为名称。
·org.quartz.scheduler.idelWaitTime
这个属性设置了当 Scheduler 处于空闲时转而再次查询可用 Trigger 时所等待的毫秒数。通常,你无需调整这个参数,除非你正使用 XA 事物,遇到了 Trigger 本该立即触发而发生延迟的问题。
·org.quartz.scheduler.dbFailureRetryInterval
这个属性设置 Scheduler 在检测到 JobStore 到某处的连接(比如到数据库的连接) 断开后,再次尝试连接所等待的毫秒数。这个参数在使用 RamJobStore 无效。
·org.quartz.scheduler.classLoadHelper.class
对于多数健状的应用,所使用的默认值为 org.quartz.simpl.CascadingClassLoadHelper 类,它会依序使用其他的 ClassLoadHelper 类,直到有一个能正常工作为止。你大概没必须为这个属性指定任何其他的类,除非有可能在应用服务器中时。当前所有可能的 ClassLoadHelper 实现可在 org.quartz.simpl 包中找到。
·org.quartz.context.key.SOME_KEY
这个属性用于向 "Scheduler 上下文" 中置入一个 名-值 对表示的字符串值。(见 Scheduler.getContext())。因此,比如设置了 org.quartz.context.key.MyEmail = myemail@somehost.com 就相当于执行了 scheduler.getContext().put("MyEmail", myemail@somehost.com)
·org.quartz.scheduler.userTransactionURL
它设置了 Quartz 能在哪里定位到应用服务器的 UserTransaction 管理器的 JNDI URL。默认值(未设定的话) 是 java:comp/UserTransaction,这几乎能工作于所有的应用服务器中。Websphere 用户也许需要设置这个属性为 jta/usertransaction。这个属性仅用于 Quartz 配置使用 JobStoreCMT 的情况,并且 org.quartz.scheduler.wrapJobExecutionInUserTransaction 被设定成了 true。
·org.quartz.scheduler.wrapJobExecutionInUserTransaction
如果你要 Quartz 在调用你的 Job 的 execute 之前启动一个 UserTransaction 的话,设置这个属性为 true。这个事物将在 Job 的 execute 方法完成和 JobDataMap(假如是一个 StatefulJob) 更新后提交。默认值为 false。
·org.quartz.scheduler.jobFactory.class
这是所用的 JobFactory 的类名称。默认为 org.quartz.simpl.SimpleJobFactory。你也可以试试 org.quartz.simpl.PropertySettingJobFactory。一个 Job 工厂负责产生 Job 类的实例。SimpleFactory 类是调用 Job 类的 newInstance() 方法。PropertySettingJobFactory 也会调用 newInstance(),但还会使用 JobDataMap 中的内容以反射方式设置 Job Bean 的属性。
[译者 Unmi 本篇后记] 从正式发布《Quartz Job Scheduling Framework 中文版.chm 》之后到现在又快过去四个月的时间了,正如前面提到的那个 CHM 文件确实包含了绝大部份主体的内容,就差最后一个附录:Quartz 配置参考,说来也是个缺憾。耽搁的太久,每天都会发生很多事情,可是这几个月对我来太不平静,家庭的、个人的、工作上的事故接踵而至。既然想起来了,还是着手完成这个事吧,之后会汇入到先前那个 CHM 文件中的。况且也还不时有人提起关于翻译版权的问题,实际上通过了解确有不对,该如何呢?暂顶顶风了。
另外,在此提一下 org.quartz.scheduler.jobFactory,因为它简单的调用 Job 类的 newInstance() 方法来得到 Job 实例,所以你的 Job 要有一个无参构造方法。有一个网友使用 Quartz 在 Scheduler 初始化 Job 时碰到这样的错误:
严重: An error occured instantiating job to be executed. job= 'jobDetailGroup1.jobDetail1'
org.quartz.SchedulerException: Problem instantiating class 'steve.InvokeCmdAction$SimpleQuartzJob' [See nested exception: java.lang.InstantiationException: steve.InvokeCmdAction$SimpleQuartzJob]
at org.quartz.simpl.SimpleJobFactory.newJob(SimpleJobFactory.java:57)
at org.quartz.core.JobRunShell.initialize(JobRunShell.java:132)
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:387)
Caused by: java.lang.InstantiationException: steve.InvokeCmdAction$SimpleQuartzJob
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
at org.quartz.simpl.SimpleJobFactory.newJob(SimpleJobFactory.java:55)
... 2 more
问题在于 Quartz 的 SimpleFactory 无法实例化 'steve.InvokeCmdAction$SimpleQuartzJob' 这个例,看这个类名,带个 $ 符号,很显然是写 InvokeCmdAction.java 文件中的,后来他把 SimpleQuartzJob 单独写在 SimpleQuartzJob.java 文件中问题即得到解决。如若有兴趣的话,定制自己的 JobFactory 配置给 org.quartz.scheduler.jobFactory 属性,那对于 'steve.InvokeCmdAction$SimpleQuartzJob' Job 类也是可以成功实例化的。