前序:
前面我们已经通过编程的方式实现了多个作业任务执行具体操作的演示;但具体到实际的时候,如果我们要在 Job
启动之后改变它的执行时间和频度,则必须去修改源代码重新编译,我们很难去以编程的形式来实现作业任务的注册(注册到任务调度器)和对其的后期维护,为了
便于维护我们将采取配置的形式来实现;
1.quartz.properties
Quartz最重要的配置文件就是quartz.properties;它决定了quartz的运行情况;其中包括了Quartz 应用运行时行为,以及运行过程中相关属性;
下面我们将大致描述下quartz.properties的相关配置项:
1)1)Configure Main Scheduler Properties ---·调度器属性
- org.quartz.scheduler.instanceName = QuartzScheduler
调度器的实例名(instanceName) ,它用来在用到多个调度器区分特定的调度器实例
- org.quartz.scheduler.instanceId = AUTO
实例 ID (instanceId),调度器的第二个属性是 org.quartz.scheduler.instanceId和
instaneName 属性一样,instanceId
属性也允许任何字符串。这个值必须是在所有调度器实例中是唯一的,尤其是在一个集群当中。假如你想 Quartz 帮你生成这个值的话,可以设置为
AUTO。如果 Quartz 框架是运行在非集群环境中,那么自动产生的值将会是
NON_CLUSTERED。假如是在集群环境下使用 Quartz,这个值将会是主机名加上当前的日期和时间。大多情况下,设置为 AUTO 即可。
2)#Configure ThreadPool ---线程池属性
- org.quartz.threadPool.threadCount = 5
接下来的部分是设置有关线程必要的属性值,这些线程在 Quartz 中是运行在后台担当重任的。threadCount
属性控制了多少个工作者线程被创建用来处理 Job。原则上是,要处理的 Job 越多,那么需要的工作者线程也就越多。threadCount
的数值至少为 1。Quartz 没有限定你设置工作者线程的最大值,但是在多数机器上设置该值超过100的话就会显得相当不实用了,特别是在你的
Job 执行时间较长的情况下。这项没有默认值,所以你必须为这个属性设定一个值。
- org.quartz.threadPool.threadPriority = 5
threadPriority 属性设置工作者线程的优先级。优先级别高的线程比级别低的线程更优先得到执行。threadPriority
属性的最大值是常量java.lang.Thread.MAX_PRIORITY,等于10。最小值为常量
java.lang.Thread.MIN_PRIORITY,为1。这个属性的正常值是
Thread.NORM_PRIORITY,为5。大多情况下,把它设置为5,这也是没指定该属性的默认值。
- org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
最后一个要设置的线程池属性是 org.quartz.threadPool.class。这个值是一个实现了
org.quartz.spi.ThreadPool 接口的类的全限名称。Quartz 自带的线程池实现类是
org.quartz.smpl.SimpleThreadPool,它能够满足大多数用户的需求。这个线程池实现具备简单的行为,并经很好的测试过。它
在调度器的生命周期中提供固定大小的线程池。你能根据需求创建自己的线程池实现,如果你想要一个随需可伸缩的线程池时也许需要这么做。这个属性没有默认
值,你必须为其指定值。
3)#Configure JobStore ---作业存储设置
- org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
作业存储部分的设置描述了在调度器实例的生命周期中,Job 和 Trigger
信息是如何被存储的。我们还没有谈论到作业存储和它的目的;因为对当前例子是非必的,所以我们留待以后说明。现在的话,你所要了解的就是我们存储调度器信
息在内存中而不是在关系型数据库中就行了。把调度器信息存储在内存中非常的快也易于配置。当调度器进程一旦被终止,所有的 Job 和 Trigger
的状态就丢失了。要使 Job 存储在内存中需通过设置 org.quartz.jobStrore.class 属性为
org.quartz.simpl.RAMJobStore,就像在前面所做的那样。假如我们不希望在 JVM
退出之后丢失调度器的状态信息的话,我们可以使用关系型数据库来存储这些信息。这需要另一个作业存储(JobStore) 实现,我们在后面将会讨论到。
4)#Configure Plugins --插件配置
- org.quartz.plugin.jobInitializer.class =
- org.quartz.plugins.xml.JobInitializationPlugin
- org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
- org.quartz.plugin.jobInitializer.failOnFileNotFound = true
- org.quartz.plugin.jobInitializer.validating=false
从上面我们的代码就可以看出来,配置的为关于作业初始化的内容;
要在我们的例子中声明式配置调度器信息,我们会用到一个 Quartz 自带的叫做 org.quartz.plugins.xml.JobInitializationPlugin 的插件。
默认时,这个插件会在 classpath 中搜索名为 quartz_jobs.xml 的文件并从中加载 Job 和 Trigger 信息。
当初始化类为JobInitializationPlugin 的时候,系统将主动到classpath下面去找到job的配置文件;
如果我们使用xml的形式来完成卒作业任务的注册,则大大提高我们的工作效率和工作的准确性!
我们的ScanDirectoryJob作业的相关信息是在将作业注册到任务调度器的时候,通过编程的方式来事项初始化的;
现在我们要通过配置文件的时候来完成作业信息初始化的动作;所以我们要将初始化的信息在配置文件上进行体现;
- <?xml version='1.0' encoding='utf-8'?>
- <quartz>
- <job> <!--一个作业是由jobdetail和Trigger来体现的-->
- <job-detail>
- <name>ScanDirectory</name> <!--作业名称-->
- <group>DEFAULT</group> <!--作业所属组别-->
- <description>
- A job that scans a directory for files
- </description> <!--作业的相关描述信息-->
- <!--指定作业类文件-->
- <job-class>
- org.cavaness.quartzbook.chapter3.ScanDirectoryJob
- </job-class
- <volatility>false</volatility>
- <durability>false</durability>
- <recover>false</recover>
- <job-data-map allows-transient-data="true">
- <entry>
- <key>SCAN_DIR</key>
- <value>c:quartz-bookinput</value>
- </entry>
- </job-data-map>
- </job-detail>
- <!--声明触发器-->
- <trigger>
- <simple>
- <name>scanTrigger</name><!--触发器的名字-->
- <group>DEFAULT</group>
- <job-name>ScanDirectory</job-name><!--触发器对于job-->
- <job-group>DEFAULT</job-group>
- <start-time><!--触发器的启动时间-->
- 2005-06-10 6:10:00 PM
- </start-time>
- <!-- 重复执行次数和间隔时间-->
- <repeat-count>-1</repeat-count>
- <repeat-interval>10000</repeat-interval>
- </simple>
- </trigger>
- </job>
- </quartz>
当使用JobInitializationPlugin插件的时候,将会主到到classpath下去找quartz_jobs.xml文件并加
载进来
,但如果我们想有自己的配置文件的话,则需要额外的告诉调度器我们现在要使用另一个配置文件来实现作业的注册;下面的file目录就是我们的新的配置文件
了;
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileName = my_quartz_jobs.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
org.quartz.plugin.jobInitializer.validating = false
org.quartz.plugin.jobInitializer.overWriteExistingJobs = false
org.quartz.plugin.jobInitializer.failOnFileNotFound = true