企业级任务调度框架Quartz(5) Quartz的声明式配置
前序:
前面我们已经通过编程的方式实现了多个作业任务执行具体操作的演示;但具体到实际的时候,如果我们要在 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-book\input</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
企业级任务调度框架Quartz(5) Quartz的声明式配置的更多相关文章
- Rabbitmq与spring整合之重要组件介绍——AMQP声明式配置&RabbitTemplate组件
上一节是使用rabbitAdmin的管理组件进行声明队列,交换器,绑定等操作,本节则是采用AMQP声明式配置来声明这些东西.AMQP声明主要是通过@Bean注解进行的. 配置: package com ...
- Quartz:不要重复造轮子,一款企业级任务调度框架。
背景 第一次遇到定时执行某些任务的需求时,很多朋友可能设计了一个小类库,这个类图提高了一个接口,然后由调度器调度所有注册的接口类型,我就是其中之一,随着接触的开源项目越来越多,我的某些开发习惯受到了影 ...
- 企业级任务调度框架Quartz(8) 线程在Quartz里的意义(2)
前序: 做为企业里的任务调度框架,出现同一时间点同时运行两个任务,或者两个任务因为开始的执行时间和执行时间的长短,很有可能出现任务并发执行的情况:因为Quartz的实现是采用java编程,那 ...
- 企业级任务调度框架Quartz(3) 一个简单的Quartz 例子
1. 一个简单的Quartz 工程 本示例应用比起众所周知的 System.out.println("Hello world from Quartz") 来还是要有趣些.当 ...
- 企业级任务调度框架Quartz(1) --企业应用中的任务调度介绍
由于目前的工作内容为建行CLPM批处理业务的设计工作,所以很好的理解批处理所用的任务调度框架Quartz势在必行:为了能够更好的去服务于工作,也 为了提升自己,所以我学习了Quartz Job Sch ...
- 企业级任务调度框架Quartz(4) 多个job实例注册到任务调度器上
前序: 在第一个例子我看到了自定义的作业类在任务调度器上注册后,则通过任务调度器来实现启动:下面,我们将同一个作业类执行两个任务,并都将他们注册到任务调度器上! 首先一个job类指向两 ...
- 企业级任务调度框架Quartz(2)-下载和安装Quartz
1.下载和安装 Quartz 根据资料上提供的网址http://www.opensymphony.com/quartz 我们可以下载到Quartz的最新版本1.6.4: 2.下载后包的说明 ...
- Spring框架的事务管理之声明式事务管理的类型
1. 声明式事务管理又分成两种方式 * 基于AspectJ的XML方式(重点掌握)(具体内容见“https://www.cnblogs.com/wyhluckdog/p/10137712.html”) ...
- 企业级任务调度框架Quartz(6) 任务调度器(Scheduler)
前序: 我们已经在前面的内容能里看到了,我们用 Scheduler 来管理我们的 Job:创建并关联触发器以使 Job 能被触发执行:以及如可选择 calendar 为给定的时程安排提供更多 ...
随机推荐
- 关于虚拟机中克隆的linux为什么不能开启网络服务
将centos克隆了一份,启动后并配置好文件,发现网络服务中只有lo(loopback),而网卡(eth0)没有启动,一开始以为是通信模式(bridged,NAT,host-only)的选择问题,最后 ...
- CSS max-width: 0;
写CSS,大家都知道max-width是要在宽度超过后才会生效,但今天我发现一个神奇的现象, 为表格td加上max-width: 0;可以让上下两个表格自动对齐,这句的作用到底是什么还有待研究,今天先 ...
- daemon not running; starting now at tcp:5037 adb: CreateFileW 'nul' failed: 系统找不到指定的文件
1. INFO - roid.tools.idea.adb.AdbService - Initializing adb using: C:\Users\Administrator\AppData\Lo ...
- 关于 图论·并查集·HDU1232&1856
其核心是追溯其根数和链接两个数,而HDU 1856要多一步,每一个根数要标记自己和自己子数的个数,因此用结构体.注意:1856 用C写没超时,用C++写超时了╮(╯﹏╰)╭ 接下来是题目和代码: 畅通 ...
- JQuery dom 操作总结
DOM 操作之获取值 获得内容 - text():设置或返回所选元素的文本内容 $("#btn1").click(function(){ alert("Text: &qu ...
- Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容 当Git无法自动合并分支时,就必须首先解 ...
- MEAN框架学习笔记
MEAN框架学习笔记 MEAN开发框架的资料非常少.基本的资料还是来自于learn.mean.io站点上的介绍. 于是抱着一种零基础学习的心态,在了解的过程中,通过翻译加上理解将MEAN框架一点点消化 ...
- hdu4762Cut the Cake(概率+大数操作(java)+C++高精度模板)
题目链接:点击打开链接 题目描写叙述:现有一个大蛋糕.上面随机分布了n个草莓,然后将草莓切成m块,问n个草莓全在一块蛋糕上面的概率? 解题思路:细致分析可得:C(n,1)/m^(n-1) 因为m< ...
- 【cocos2d-x 3.7 飞机大战】 决战南海I (八) 背景移动
採用双层背景.这样效果更好 .h class BackgroundMove : public Layer { public: BackgroundMove(); ~BackgroundMove(); ...
- Android之怎样更改获取焦点的先后顺序
在组件中增加<requestFocus />能够首先获得焦点 以TextView为例: 例如以下: <TextView android:layout_width=&q ...