前序:
    前面我们已经通过编程的方式实现了多个作业任务执行具体操作的演示;但具体到实际的时候,如果我们要在 Job
启动之后改变它的执行时间和频度,则必须去修改源代码重新编译,我们很难去以编程的形式来实现作业任务的注册(注册到任务调度器)和对其的后期维护,为了
便于维护我们将采取配置的形式来实现;

1.quartz.properties

    Quartz最重要的配置文件就是quartz.properties;它决定了quartz的运行情况;其中包括了Quartz 应用运行时行为,以及运行过程中相关属性;

下面我们将大致描述下quartz.properties的相关配置项:

1)1)Configure Main Scheduler Properties ---·调度器属性

  1. org.quartz.scheduler.instanceName = QuartzScheduler

调度器的实例名(instanceName) ,它用来在用到多个调度器区分特定的调度器实例

  1. org.quartz.scheduler.instanceId = AUTO

实例 ID (instanceId),调度器的第二个属性是 org.quartz.scheduler.instanceId和
instaneName 属性一样,instanceId
属性也允许任何字符串。这个值必须是在所有调度器实例中是唯一的,尤其是在一个集群当中。假如你想 Quartz 帮你生成这个值的话,可以设置为
AUTO。如果 Quartz 框架是运行在非集群环境中,那么自动产生的值将会是

NON_CLUSTERED。假如是在集群环境下使用 Quartz,这个值将会是主机名加上当前的日期和时间。大多情况下,设置为 AUTO 即可。

2)#Configure ThreadPool    ---线程池属性

  1. org.quartz.threadPool.threadCount =  5

接下来的部分是设置有关线程必要的属性值,这些线程在 Quartz 中是运行在后台担当重任的。threadCount
属性控制了多少个工作者线程被创建用来处理 Job。原则上是,要处理的 Job 越多,那么需要的工作者线程也就越多。threadCount
的数值至少为 1。Quartz 没有限定你设置工作者线程的最大值,但是在多数机器上设置该值超过100的话就会显得相当不实用了,特别是在你的
Job 执行时间较长的情况下。这项没有默认值,所以你必须为这个属性设定一个值。

  1. org.quartz.threadPool.threadPriority = 5

threadPriority 属性设置工作者线程的优先级。优先级别高的线程比级别低的线程更优先得到执行。threadPriority
属性的最大值是常量java.lang.Thread.MAX_PRIORITY,等于10。最小值为常量
java.lang.Thread.MIN_PRIORITY,为1。这个属性的正常值是
Thread.NORM_PRIORITY,为5。大多情况下,把它设置为5,这也是没指定该属性的默认值。

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

最后一个要设置的线程池属性是 org.quartz.threadPool.class。这个值是一个实现了
org.quartz.spi.ThreadPool 接口的类的全限名称。Quartz 自带的线程池实现类是
org.quartz.smpl.SimpleThreadPool,它能够满足大多数用户的需求。这个线程池实现具备简单的行为,并经很好的测试过。它
在调度器的生命周期中提供固定大小的线程池。你能根据需求创建自己的线程池实现,如果你想要一个随需可伸缩的线程池时也许需要这么做。这个属性没有默认
值,你必须为其指定值。

3)#Configure JobStore  ---作业存储设置 

  1. 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     --插件配置

  1. org.quartz.plugin.jobInitializer.class =
  2. org.quartz.plugins.xml.JobInitializationPlugin
  3. org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
  4. org.quartz.plugin.jobInitializer.failOnFileNotFound = true
  5. org.quartz.plugin.jobInitializer.validating=false

从上面我们的代码就可以看出来,配置的为关于作业初始化的内容;

要在我们的例子中声明式配置调度器信息,我们会用到一个 Quartz 自带的叫做 org.quartz.plugins.xml.JobInitializationPlugin 的插件。

默认时,这个插件会在 classpath 中搜索名为 quartz_jobs.xml 的文件并从中加载 Job 和 Trigger 信息。

当初始化类为JobInitializationPlugin 的时候,系统将主动到classpath下面去找到job的配置文件;

如果我们使用xml的形式来完成卒作业任务的注册,则大大提高我们的工作效率和工作的准确性!

我们的ScanDirectoryJob作业的相关信息是在将作业注册到任务调度器的时候,通过编程的方式来事项初始化的;

    现在我们要通过配置文件的时候来完成作业信息初始化的动作;所以我们要将初始化的信息在配置文件上进行体现;

  1. <?xml version='1.0' encoding='utf-8'?>
  2. <quartz>
  3. <job> <!--一个作业是由jobdetail和Trigger来体现的-->
  4. <job-detail>
  5. <name>ScanDirectory</name> <!--作业名称-->
  6. <group>DEFAULT</group>     <!--作业所属组别-->
  7. <description>
  8. A job that scans a directory for files
  9. </description> <!--作业的相关描述信息-->
  10. <!--指定作业类文件-->
  11. <job-class>
  12. org.cavaness.quartzbook.chapter3.ScanDirectoryJob
  13. </job-class
  14. <volatility>false</volatility>
  15. <durability>false</durability>
  16. <recover>false</recover>
  17. <job-data-map allows-transient-data="true">
  18. <entry>
  19. <key>SCAN_DIR</key>
  20. <value>c:\quartz-book\input</value>
  21. </entry>
  22. </job-data-map>
  23. </job-detail>
  24. <!--声明触发器-->
  25. <trigger>
  26. <simple>
  27. <name>scanTrigger</name><!--触发器的名字-->
  28. <group>DEFAULT</group>
  29. <job-name>ScanDirectory</job-name><!--触发器对于job-->
  30. <job-group>DEFAULT</job-group>
  31. <start-time><!--触发器的启动时间-->
  32. 2005-06-10 6:10:00 PM
  33. </start-time>
  34. <!-- 重复执行次数和间隔时间-->
  35. <repeat-count>-1</repeat-count>
  36. <repeat-interval>10000</repeat-interval>
  37. </simple>
  38. </trigger>
  39. </job>
  40. </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

企业级任务调度框架Quartz(5) Quartz的声明式配置的更多相关文章

  1. Rabbitmq与spring整合之重要组件介绍——AMQP声明式配置&RabbitTemplate组件

    上一节是使用rabbitAdmin的管理组件进行声明队列,交换器,绑定等操作,本节则是采用AMQP声明式配置来声明这些东西.AMQP声明主要是通过@Bean注解进行的. 配置: package com ...

  2. Quartz:不要重复造轮子,一款企业级任务调度框架。

    背景 第一次遇到定时执行某些任务的需求时,很多朋友可能设计了一个小类库,这个类图提高了一个接口,然后由调度器调度所有注册的接口类型,我就是其中之一,随着接触的开源项目越来越多,我的某些开发习惯受到了影 ...

  3. 企业级任务调度框架Quartz(8) 线程在Quartz里的意义(2)

    前序:      做为企业里的任务调度框架,出现同一时间点同时运行两个任务,或者两个任务因为开始的执行时间和执行时间的长短,很有可能出现任务并发执行的情况:因为Quartz的实现是采用java编程,那 ...

  4. 企业级任务调度框架Quartz(3) 一个简单的Quartz 例子

    1. 一个简单的Quartz 工程     本示例应用比起众所周知的 System.out.println("Hello world from Quartz") 来还是要有趣些.当 ...

  5. 企业级任务调度框架Quartz(1) --企业应用中的任务调度介绍

    由于目前的工作内容为建行CLPM批处理业务的设计工作,所以很好的理解批处理所用的任务调度框架Quartz势在必行:为了能够更好的去服务于工作,也 为了提升自己,所以我学习了Quartz Job Sch ...

  6. 企业级任务调度框架Quartz(4) 多个job实例注册到任务调度器上

    前序:     在第一个例子我看到了自定义的作业类在任务调度器上注册后,则通过任务调度器来实现启动:下面,我们将同一个作业类执行两个任务,并都将他们注册到任务调度器上!     首先一个job类指向两 ...

  7. 企业级任务调度框架Quartz(2)-下载和安装Quartz

    1.下载和安装 Quartz 根据资料上提供的网址http://www.opensymphony.com/quartz 我们可以下载到Quartz的最新版本1.6.4: 2.下载后包的说明       ...

  8. Spring框架的事务管理之声明式事务管理的类型

    1. 声明式事务管理又分成两种方式 * 基于AspectJ的XML方式(重点掌握)(具体内容见“https://www.cnblogs.com/wyhluckdog/p/10137712.html”) ...

  9. 企业级任务调度框架Quartz(6) 任务调度器(Scheduler)

    前序:      我们已经在前面的内容能里看到了,我们用 Scheduler 来管理我们的 Job:创建并关联触发器以使 Job 能被触发执行:以及如可选择 calendar 为给定的时程安排提供更多 ...

随机推荐

  1. java中的replaceAll方法注意事项

    replaceAll和replace方法参数是不同的,replace的两个参数都是代表字符串,replaceAll的第一个参数是正则表达式 replaceAll中需要注意的特殊字符: \ == \\\ ...

  2. python orm框架-----SQLALchemy-查询篇

    似乎ORM最难设计的部分是查询.特别是面向对象的查询,今天学习SQLAlchemy,发现SQLAlchemy的查询语法竟如此灵活,惊叹其如此强大的表达能力的同时也对Python也有了更深的认识.下面看 ...

  3. SCU - 4117 - Discover

    先上题目: D - Discover Time Limit:0MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit St ...

  4. NYOJ 一笔画问题 欧拉路

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...

  5. POJ 2068

    就是必胜点与必败点的计算而已.计算每一种情况.设st[i][j]为在第i个人剩下j个石头时的情况,拿它转移后的情况比较.可以到达必败点,则当前为必胜点.若只能到达必胜点,则当前点为必败点. #incl ...

  6. HDU 1466

    经典DP,这样的递推确实有点难. 把所有直线分成两组,可以知道 m条直线的交点方案数 =(m-r)条平行线与r条直线交叉的交点数  + r条直线本身的交点方案 亦就是  =(m-r)*r+r条之间本身 ...

  7. UVA 10888 - Warehouse(二分图完美匹配)

    UVA 10888 - Warehouse option=com_onlinejudge&Itemid=8&page=show_problem&category=562& ...

  8. 6.26的二分(久违的AC)

    /* codevs 2765 很明显的二分 半年不写代码 超丑 怎么能忍, */ #include<cstdio> #include<algorithm> #define ma ...

  9. c25---条件编译

    // // main.c // 条件编译(宏定义是简单的替换,要给参数和结果都加括号) #include <stdio.h> #define SCORE 90 #define DEBUG ...

  10. sublime中BracketHighlighter 插件使用 (转)

    sublime中BracketHighlighter 插件使用 1.打开package Control,选择install Package 2.输入BracketHighlighter,回车 3.这样 ...