您的位置:首页 > 其它

任务调度 Quartz企业开发介绍

2016-01-06 11:08 239 查看

1、Quartz基本概念及原理

Quartz Scheduler开源框架:

Quartz是OpenSymphony开源组织在任务调度领域的开源项目,完全基于java实现。该项目于2009年被Terracotta收购,目前是Terracotta旗下的一个项目。
可以到http://www.quartz-scheduler.org/站点下载Quartz的发布版本及其源码。

Quartz特点:
1、强大的调度功能,支持丰富多样的调度方法,能满足各种常规及特殊需求;
2、灵活的应用方式,支持和调度的多种方式,支持调度数据的多种存储方式;
3、分布式和集群能力,Terracotta收购后在原来的基础上做了进一步的提升。
另外,它作为Spring默认的调度框架,Quartz很容易与Spring集成实现灵活可配置的调度功能。

专用词汇说明:

scheduler:任务调度器,实际执行调度的控制器;
trigger:触发器,用于定义任务调度时间规则;
job:任务,即被调用的任务;
misfire:错过了,指本来应该被执行但实际没有执行的任务调度;

在Quartz中,scheduler由scheduler工厂创建:DirectSchedulerFactory或者StdSchedulerFactory。第二种工厂StdSchedulerFactory使用较多,因为第一种使用起来不方便,需要做许多详细的手工编码设置。Scheduler主要有三种:RemoveMBeanScheduler,RemoteScheduler和StaScheduler。

trigger是用于定义调度时间的元素,即按照什么时间规则去执行任务,Quartz中主要有四种类型的trigger:SimpleTrigger,CronTrigger,DatelntervalTrigger和NthlncludedDayTrigger。

job用于被执行调度的任务,主要有两种类型的job:无态度的(stateless)和有状态的(stateful)。对于同一个Trigger来说,有状态的job不能被并行执行,只有上一次被触发的任务执行完毕后,才能触发下一次执行。job主要有两个属性:volatility和durablity,其中volatility表示任务是否被持续化到数据库存储,而durability表示在没有Trigger关联的时候任务是否被保留。这两者都是在值为true的时候任务被持久化或保留。一个job可以被多个Trigger关联,但是一个Trigger只能关联一个job。

数据存储:

Quartz中的Trigger和job需要存储下来能使用。Quartz中有两种存储方式:RAMJobStore,JobStoreSupport。其中RAMJobStore是将trigger和job存储在内存中,而JobStoreSupport是基于jdbc将trigger 和job存储到数据库中。RAMJobStore的存取速度非常快,但是系统被停止后所有的数据都会丢失,所以在通常应用中,都是使用JobStoreSupport。

2、基本开发流程及简单实例

环境搭建:

将所需要的jar及其依赖jar导入到classpath即可(此处所用版本为2.2.1):



最好在开发时将Quartz的源代码导入到开发环境中来。一方面可以通过阅读源码了解Quartz的实现原理,另一方面可以通过扩展或修改Quartz的一些类来实现某些尚不提供的功能。

配置文件:

A、quartz.properties

#============================================================================

# Configure Main Scheduler Properties

#============================================================================

org.quartz.scheduler.instanceName = org.quartz.scheduler.instanceId = AUTO
#============================================================================

# Configure ThreadPool

#============================================================================

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3
org.quartz.threadPool.threadPriority = 5

#============================================================================

# Configure Plugins

#============================================================================

org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileName = quartz-config.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval = 10
配置说明:
配置属性均以org.quartz开头。

调度属性:
<pre name="code" class="java"><pre name="code" class="java"># Configure Main Scheduler Properties



调度器属性包括两部分:分别是设置调度的实例名(instanceName) 和(instanceId)。属性org.quartz.scheduler.instanceName可以是任何的字符串。默认名字一般都采用QuartzScheduler;第二个属性org.quartz.scheduler.instanceId和instanceName属性一样,instanceId属性也允许任何字符串。这个值必须是所有调度器实例中唯一的,尤其是在一个集群当中。可以通过Quartz框架生成,设置成AUTO。

线程池属性:
# Configure ThreadPool

这些线程在Quartz中是运行在后台担当重任的。org.quartz.threadPool.class,该值的设置是实现了org.quartz.spi.ThreadPool接口的类的权限名称。org.quartz.simpleTreadPool,它能够满足大多数用户的需求。这个线程池实现具备简单的行为,它在调度的生命周期中提供固定大小的线程池(该属性无默认值)。
org.quartz.threafPool.threadCount属性指定了线程池中可同时处理job的数量。至少为1,无限定最大值,但是大多数机器上设置改值超过100的话性能会明显下降(该属性无默认值)。
org.quartz.threafPool.threadPriority属性指定了工作线程优先级。优先级高的线程比优先级底的线程优先执行。最大值为10,最小值为1,正常值为5,也是大多数情况下设置的值,也是默认的值。

插件配置:
# Configure Plugins

org.quartz.plugin.triggHistory.class:属性值为org.quartz.plugin.LoggingJobHistoryPlugin表示记录所有工作执行的历史(本示例中使用的);另外有org.quartz.plugin.LoggingTriggerHistoryPlugin:触发器触发日志记录。

org.quartz.plugin.jobInitializer.class指定插件的实现类。
org.quartz.plugin.jobInitializer.fileName:默认会在classpath下寻找quartz_job.xml来获得声明的消息。可通过设置改变配置job的文件名。
org.quartz.plugin.jobInitializer.overWriteExistingJobs:为true时,当有jobDetail被修改不会造成失效(false反之);结合使用另一个配置org.quartz.plugin.jobInitializer.scanInterval=10;自动扫描任务单改动的时间间隔(默认为0,表示不自动加载),单位为秒。读者自行设置即可。

org.quartz.plugin.jobInitializer.failOnFileNotFound=true,基本上设置成true,不是太了解这个属性......

B、quartz-config.xml

<?xml version='1.0' encoding='utf-8'?>
<quartz>
<job>
<job-detail>
  <name>SendShortMessageJob</name>
  <group>DEFAULT</group>
  <description>SendShortMessageJob</description>
  <job-class>com.homs.quartz.SendShortMessageJob</job-class>
  <job-data-map allows-transient-data="true">
  <entry>
  <key>SendShortMessageJob</key>
   <value>SendShortMessageJob</value>
  </entry>
</job-data-map>
  </job-detail>
   <trigger>
<cron>
<name>SendShortMessageJob</name>
<group>DEFAULT</group>
<job-name>SendShortMessageJob</job-name>
<job-group>DEFALUT</job-group>
<cron-expression>0 */1 * * * ?</cron-expression>
</cron>
</trigger>
</job></quartz>
job定义一个任务,包括一个job-detail及一个trigger。
<job-detail>中,name指定任务名(唯一);group为任务所在组(group和name唯一确定一个任务);description任务描述;job-class指定任务多在类;
job-data-map:指定job中设置键值对,可在程序中通过JobExecutionContext任务上下文获取。
<trigger>中,设置触发器,name为触发器名(唯一);group为触发器组名;job-name必须和对应的job的name一样,group同理;常用的触发器类型,也是企业级开发推荐,通过cron表达式设置,推荐。

关于企业级开发常见应用参见:http://www.ibm.com/developerworks/cn/opensource/os-cn-quartz/index.html
更多cron表达式学习参见:http://www.cnblogs.com/linjiqin/archive/2013/07/08/3178452.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: