前序:
    前面我们已经通过编程的方式实现了多个作业任务执行具体操作的演示;但具体到实际的时候,如果我们要在 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. python第十周:进程、协程、IO多路复用

    多进程(multiprocessing): 多进程的使用 multiprocessing是一个使用类似于线程模块的API支持产生进程的包. 多处理包提供本地和远程并发,通过使用子进程而不是线程有效地侧 ...

  2. JAVA的输入输出基本操作样例

    这些类的继承关系有些类似,弄一个作为样例,理解一下其中的机制. package cc.openhome; import java.io.*; public class Member { private ...

  3. Hadoop版本:CDH, HDP, MapR

    Hadoop版本:CDH, HDP, MapR 学习了:http://dongxicheng.org/mapreduce-nextgen/hadoop-distribution-selection/ ...

  4. android制作闪动的红心

    先上一张效果图吧: 说说这个东西的来源吧.今天突然想到笛卡尔心形图,想去看看能不能画个心出来,可是看到一篇不错的文章,那篇文章罗列了非常多关于心形的函数方程,这可把我高兴坏了,于是我选取了一个比較好看 ...

  5. 使用enca进行字符集转码

    在linux进行开发与运维的时候,我们常常遇到字符编码的问题,系统字符设置.vimrc fileencoding设置.终端设置往往搞的晕头转向,当一个文件出现乱码的时候,我们通常不能识别它是什么编码的 ...

  6. Linux环境中Apache也就是httpd服务的启动,查看版本等操作

    本机是虚拟机,装的redhat Linux版本,默认是安装了httpd的 打开terminal 切换到root用户 cd到/etc/rc.d/init.d/目录,并列出该目录下的所有文件,看看是否有h ...

  7. js中简单操作

    去空格:ss.replace(/\s/g,""); 数组: 千万不能用in操作符 in 是说存不存在这个key而不是value! var a = [66,99,77]; 66 in ...

  8. svn代码回滚命令【转】

    本文转载自:http://www.cnblogs.com/jndream/archive/2012/03/20/2407955.html 取消对代码的修改分为两种情况:   第一种情况:改动没有被提交 ...

  9. 【SCOI 2005】 骑士精神

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1085 [算法] IDA* [代码] #include<bits/stdc++. ...

  10. 利用网络Socket和多线程实现一个双向聊天

    接收键盘输入然后向对方发送消息的线程 package cn.com.chat; import java.io.BufferedReader; import java.io.BufferedWriter ...