分享

spring Quartz配置

 暖风醉伊人 2014-08-15

Quartz

    Quartz是一个完全由java编写的开源作业调度框架.

    Quartz最主要的功能就是调度器(完成定时任务),可以与javaEE或者javaSE应用程序相结合也可以单独使用。

    Quartz能借助关系数据库和JDBC作业存储支持集群,负载均衡。

 

需要的jar包:

spring.jar 
quartz-1.6.1.jar 
commons-logging.jar 
commons-collections.jar 
log4j-1.2.15.jar 

 

Spring Quartz

    Spring中继承并简化了Quartz, 我们可以通过配置Spring简化Quartz的配置。

在ApplicationContext.xml配置数据源,并且引入ApplicationContext-quartz.xml文件。

ApplicationContext.xml:

Xml代码  收藏代码
  1. <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">   
  2.     <property name="jndiName" value="java:comp/env/jdbc/publicdb"></property>   
  3. </bean>  
  4.                     .  
  5.                     .  
  6.                     .  
  7.                     .  
  8. <!--  import  -->  
  9. <import resource="ApplicationContext-quartz.xml" />  

 

 

ApplicationContext-quartz.xml:

Java代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www./dtd/spring-beans.dtd">  
  3.   
  4. <!-- 在<Beans>中设置default-autowire="byName"的属性,不能通过Bean名称自动注入,必须通过明确引用注入 -->  
  5. <beans default-autowire="byName">  
  6.     <!-- 要调用的工作类 -->  
  7.     <bean id="reportCreateJob" class="org.quartz.JobDetail">  
  8.         <property name="jobClass">  
  9.             <value>com.hundsun.u3c.reportserver.quartz.job.ReportCreateJob</value>  
  10.         </property>  
  11.         <property name="name" value="reportCreate-processor-job" />  
  12.     </bean>  
  13.     <!-- 定义触发时间 -->  
  14.     <bean id="reportCreateTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  
  15.         <property name="jobDetail">  
  16.             <ref bean="reportCreateJob" />  
  17.         </property>  
  18.         <property name="cronExpression">  
  19.             <value>0 * * * * ?</value>  
  20.         </property>  
  21.     </bean>  
  22.     <!-- 管理类:配置Schedule信息,与spring容器的生命周期建立联系等功能 -->  
  23.     <bean id="scheduler"  
  24.         class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  25.         <property name="dataSource" ref="dataSource" />  
  26.         <!-- 在SchedulerFactoryBean初始化完成后,延迟300秒启动Scheduler,以便让Spring能够更快初始化容器中剩余的Bean。-->   
  27.         <property name="startupDelay" value="300" />  
  28.         <property name="applicationContextSchedulerContextKey" value="applicationContextKey" />  
  29.         <property name="quartzProperties">  
  30.             <props>  
  31.                 <prop key="org.quartz.scheduler.instanceName">qmsQuartzScheduler</prop>  
  32.                 <prop key="org.quartz.scheduler.instanceId">AUTO</prop>  
  33.                 <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>  
  34.                 <prop key="org.quartz.threadPool.threadCount">3</prop>  
  35.                 <prop key="org.quartz.threadPool.threadPriority">5</prop>  
  36.                 <prop key="org.quartz.jobStore.misfireThreshold">60000</prop>  
  37.                 <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>  
  38.                 <prop key="org.quartz.jobStore.driverDelegateClass">${QUARTZ_DRIVERDELEGATECLASS}</prop>  
  39.                 <prop key="org.quartz.jobStore.selectWithLockSQL">SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?</prop>  
  40.                 <prop key="org.quartz.jobStore.tablePrefix">U3C_QRTZ_</prop>  
  41.                 <prop key="org.quartz.jobStore.isClustered">true</prop>  
  42.                 <prop key="org.quartz.jobStore.clusterCheckinInterval">20000</prop>  
  43.             </props>  
  44.         </property>  
  45.         <!-- scheduler by QuartzAdjust -->  
  46.         <property name="triggers">  
  47.             <list>  
  48.                 <ref bean="reportCreateTrigger" />  
  49.             </list>  
  50.         </property>  
  51.     </bean>  
  52. </beans>  

 

JobDetail: 可以使用Quartz的JobDetail在Spring中配置一个JobDetail Bean,但是JobDetail使用带参的构造函数。[public void execute(JobExecutionContext arg0)]

也可以使用JobDetailBean,Spring通过扩展JobDetail提供了一个更具Bean风格的JobDetailBean。此外,Spring提供了一个MethodInvokingJobDetailFactoryBean,通过这个FactoryBean可以将Spring容器中Bean的方法包装成Quartz任务,这样开发者就不必为Job创建对应的类。

 

CronTriggerBean调度器:每到指定时间则触发一次。与之相对的还有SimpleTriggerBean调度器,每隔指定时间则触发一次。

属性解释:

  1.jobDetail:对应的JobDetail.

  2.cronExpression:Cron表达式,后面详解。

 

SchedulerFactoryBean是Spring继承Quartz而提供的类。
Scheduler和Spring容器的生命周期相关联。Spring容器启动后,Scheduler自动开始工作,而在Spring容器关闭前,自动关闭Scheduler。Scheduler在Spring容器的生命周期完成自动启动和关闭的操作。
SchedulerFactoryBean功能:
  1.以更具Bean风格的方式为Scheduler提供配置信息。
  2.让Scheduler和Spring容器的生命周期建立关联,相生相息。
  3.通过属性配置部分或全部代替Quartz自身的配置文件。

参数解释:

  1.dataSource: 当需要使用数据库来持久化任务调度数据时,你可以在Quartz中配置数据源,也可以直接在Spring中通过dataSource指定一个Spring管理的数据源。如果指定了该属性,即使quartz.properties中已经定义了数据源,也会被此dataSource覆盖。

  2.startupDelay:在SchedulerFactoryBean初始化完成后,延迟启动Scheduler,以便让Spring能够更快初始化容器中剩余的Bean。

  3.quartzProperties:类型为Properties,允许你在Spring中定义Quartz的属性。其值将覆盖quartz.properties配置文件中的设置,这些属性必须是Quartz能够识别的合法属性。在配置时你可以需要查看Quartz的相关文档。

  4.transactionManager:可以通过该属性设置一个Spring事务管理器。在设置dataSource时,Spring强烈推荐你使用一个事务管理器,否则数据表锁定可能不能正常工作。

 

JobDetailBean:

Java代码  收藏代码
  1.  * @author jiangbo  
  2.  *   
  3.  */  
  4. public class ReportCreateJob implements StatefulJob {  
  5.   
  6.   private static Logger log = Logger.getLogger(ReportCreateJob.class);  
  7.   
  8.   @Override  
  9.   public void execute(JobExecutionContext arg0) throws JobExecutionException {  
  10.     log.debug("===into quartz job =======>");  
  11.     ReportCreateBusiness.getInstance().createReport();  
  12.   }  
  13. }  

 

Quartz的集群配置

org.quartz.scheduler.instanceName属性可为任何值,用在 JDBC JobStore 中来唯一标识实例,但是所有集群节点中必须相同。

org.quartz.scheduler.instanceId属性为AUTO即可,基于主机名和时间戳来产生实例ID。

org.quartz.jobStore.isClustered设置为"true"激活集群特性

org.quartz.jobStore.class属性为JobStoreTX,将任务持久化到数据中。因为集群中节点依赖于数据库来传播Scheduler实例的状态,你只能在使用JDBC JobStore时应用Quartz集群。这意味着你必须使用JobStoreTX或是JobStoreCMT作为Job存储。你不能在集群中使用RAMJobStore。

org.quartz.jobStore.clusterCheckinInterval属性定义了Scheduler实例检入到数据库中的频率(单位:毫秒)。Scheduler检查是否其他的实例到了它们应当检入的时候未检入。这能指出一个失败的Scheduler实例,且当前 Scheduler会以此来接管任何执行失败并可恢复的Job。通过检入操作,Scheduler 也会更新自身的状态记录。clusterChedkinInterval越小,Scheduler节点检查失败的Scheduler实例就越频繁。默认值是15000 (即15秒)。

dataSource:项目中用到的数据源,里面包含了quartz用到的12张数据库表。

applicationContextSchedulerContextKey:org.springframework.scheduling.quartz.SchedulerFactoryBean这个类中把spring上下文以key/value的方式存放在了quartz的上下文中了,可以用applicationContextSchedulerContextKey所定义的key得到对应的spring上下文.

configLocation:用于指明quartz的配置文件的位置.

 

Quartz集群12张表

 

表名描述
QRTZ_CALENDARS以Blob类型存储Quartz的Calendar信息.
QRTZ_CRON_TRIGGERS存储Cron Trigger,包括Cron表达式和时区信息.
QRTZ_FIRED_TRIGGERS存储与已触发的Trigger相关的状态信息,以及相联Job的执行信息.
QRTZ_PAUSED_TRIGGER_GRPS存储已暂停的Trigger组的信息。
QRTZ_SCHEDULER_STATE存储少量的有关Scheduler的状态信息,和别的cheduler 实例(假如是用于一个集群中)
QRTZ_LOCKS存储程序的非观锁的信息(假如使用了悲观锁)。
QRTZ_JOB_DETAILS存储每一个已配置的Job的详细信息。
QRTZ_JOB_LISTENERS存储有关已配置的JobListener的信息。
QRTZ_SIMPLE_TRIGGERS存储简单的Trigger,包括重复次数,间隔,以及已触的次数。
QRTZ_BLOG_TRIGGERSTrigger作为Blob类型存储(用于Quartz用户用JDBC创建他们自己定制的Trigger类型,JobStore并不知道如何存储实例的时候)
QRTZ_TRIGGER_LISTENERS存储已配置的TriggerListener的信息.
QRTZ_TRIGGERS存储已配置的Trigger的信息.

 QRTZ_TRIGGERS表中TRIGGER_STATE字段显示任务的属性:

  WAITING:等待  
  PAUSED:暂停 
  ACQUIRED:正常执行 
  BLOCKED:阻塞 
  ERROR:错误

 

Cron表达式

Quartz使用类似于Linux下的Cron表达式定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成。

Cron表达式时间字段:

 

位置时间域名允许值允许的特殊字符
10-59, - * /
2分钟0-59, - * /
3小时0-23, - * /
4日期1-31, - * ? / L W C
5月份1-12, - * /
6星期1-7, - * ? / L C #
7年(可选)空值1970-2099, - * /

 

Cron表达式示例:

 

表达式说明
"0 0 12 * * ? "每天12点运行
"0 15 10 * * ?"每天10:15运行
"0 15 10 * * ? 2011"2011年的每天10:15运行
"0 * 14 * * ?"每天14点到15点之间每分钟运行一次,开始于14:00,结束于14:59。
"0 0/5 14 * * ?"每天14点到15点每5分钟运行一次,开始于14:00,结束于14:55。
"0 0/5 14,18 * * ?"每天14点到15点每5分钟运行一次,此外每天18点到19点每5钟也运行一次。
"0 0-5 14 * * ?"每天14:00点到14:05,每分钟运行一次。
"0 10,44 14 ? 3 WED"

3月每周三的14:10分到14:44,每分钟运行一次。

"0 15 10 ? * MON-FRI"每周一,二,三,四,五的10:15分运行。
"0 15 10 15 * ?"每月15日10:15分运行。
"0 15 10 L * ?"每月最后一天10:15分运行。
"0 15 10 ? * 6L"每月最后一个星期五10:15分运行。
"0 15 10 ? * 6L 2007-2009"在2007,2008,2009年每个月的最后一个星期五的10:15分运行。
"0 15 10 ? * 6#3"每月第三个星期五的10:15分运行。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多