任务调度 Quartz企业开发介绍

本文深入介绍了Quartz任务调度框架的基本概念、特点、专用词汇说明,以及如何进行基本开发流程与简单实例。重点阐述了QuartzScheduler、scheduler、trigger、job、misfire等核心概念,并提供了详细的配置文件与示例代码,帮助开发者快速掌握Quartz的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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表达式设置,推荐。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值