Dashboard > SpringSide Wiki > ... > Other Features > Quartz
  SpringSide Wiki Log In | Sign Up   View a printable version of the current page.  
  Quartz
Added by Calvin, last edited by SpringSideTeam on 2006-12-26  (view change)
Labels: 

Quartz 指南

1.  概述 

  Quartz(http://www.opensymphony.com/quartz/)是最常用的定时执行任务框架,可以自行用API设定调度,也可以集成到Spring里面,以配置文件调度POJO文件的方法执行。

1.1 参考资料

  •  《Quartz Job Scheduling Framework》 2006年新书,可以Emule得到,很多原来文档不详细的地方如clustering等都可以在里面看到。

2.与Spring集成

2.1  Scheduler 总入口

<bean name="quartzScheduler"
          class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
           <list>
                <ref bean="cronTrigger"/>
            </list>
        </property>
        <property name="configLocation" value="classpath:quartz.properties"/>
    </bean>

   quartz的详细配置在quartz.properties文件,具体配置见其注释或参考参考文档,一般默认即为JVM嵌入式Scheduler。也可以配置把任务执行情况存储于数据库中,即使服务器重起,也能保证任务计划正确执行。

   比如定义12点运行任务的,如果12:05运行了一次,然后服务器在12:30重启,如果没有持久化,那还会重新运行一次。

   可惜hsqldb不支持select * from foo for update 这样的行锁定sql语法,无法demo。

2.2 Trigger

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="jobDetail"/>
        <!--朝九晚五工作时间内每半小时执行一次-->
        <property name="cronExpression" value="0 0/30 9-17 *,* * ?"/>
    </bean>

强大的cronTrigger,类似著名的cron表达式,方便我们任意的job控制的想法。

   当然quartz也有简单的simpleTrigger,实现的东西就和jdk中的timer差不多了,另还有好几个其他的timer。详细请参考quartz 的文档。

2.3 POJO式定义 

Spring中与quartz 的结合方式有两种,一种是以quartz本身的一些特性,没有很好的体现springside的一切都是pojo宗旨,这里暂且不谈,而springside中实现的是以pojo为job的一种做法,大致的配置如下:

<!-- 使用pojo来做job,指定pojo和method -->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="bookStockChecker"/>
        <property name="targetMethod" value="check"/>
    </bean>

2.4 小心陷阱

  1. 启动计划的FactoryBean们不要lazy-load,否则计划无法启动。
  2. Scheduler不要Autowire,否则会传入一个DataSource/SessionFactory给Scheduler,Scheduler就会认为是许要持久化任务执行情况,而其实你是JVM形式执行的,就会报没有建立Quartz持久化表,Table or View not Found。

3. Quartz相对于JDK Timer Task的进步 

  1. 首先是细致的Cron语法;
  2. 然后是可以把任务执行情况存储于数据库中,即使服务器重起,也能保证任务计划正确执行,详见2.1 Scheduler 总入口;
  3. 还有线程池并发执行的能力;
  4. 还有群集执行的能力。

  以上特征都可以在quartz的配置文件quartz.properties里看出样貌。

4.常见问题

4.1 如何在Spring配置文件里如何设定定时执行函数的参数?

  这是个伪问题,定时执行的函数应该是无参的。正确的方法设定该POJO的成员变量,或者由POJO自行去读取某个配置文件。

Site powered by a free Open Source Project / Non-profit License (more) of Confluence - the Enterprise wiki.
Learn more or evaluate Confluence for your organisation.
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.2.9 Build:#527 2006-09-07) - Bug/feature request - Contact Administrators