当前位置: 首页 > 图文教程 > Java技术 > Web框架 > 浅谈Spring中使用Quartz来执行计划任务

Web框架
Struts开发过程中的异常处理机制
ServletContext与ServletConfig分析
使用Ajax的挑战
Web程序从Struts向Stripes框架的移植
Shale不是Struts
Web框架:基于Ajax的应用程序架构汇总
Web框架:使用Ajax技术开发Web应用程序
Web框架:简单理解Hibernate三种状态的概念及互相转化
Web框架:浅谈Struts2中拦截器应用
Web框架:Struts2中的Action
Web框架:Struts2高级文件上传
Web框架:小编谈嵌入XFire服务介绍及实现
Web框架:DWR中signatures标签的使用
WEB框架:小编总结Struts2的经典输入校验
WEB框架:小编祥谈Struts2的数据标签中Action与Bean标签的使用
Web框架:小议struts2类型转换
Web框架:小编浅谈Struts2的pub-sub事件模型
Web框架:小编简述JSF
Web框架:Hibernate事务管理
Web框架:Struts高级特性(StrutsAdvancedFeature)验证

Web框架 中的 浅谈Spring中使用Quartz来执行计划任务


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-23   浏览: 293 ::
收藏到网摘: n/a

下面要和大家分享的是spring中使用Quart来执行计划,通常情况下,你只需要调用特定对象上的一个方法。你可以使用MethodInvokingJobDetailFactoryBean准确的做到这一点:

 

<bean id="methodInvokingJobDetail"   class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">    <property name="targetObject"><ref bean="exampleBusinessObject"/></property>    <property name="targetMethod"><value>doIt</value></property></bean>

 

上面例子将导致exampleBusinessObject中的doIt方法被调用(如下):

 

public class BusinessObject {     // properties and collaborators    public void doIt() {     // do the actual work   } }     

 

 

<bean id="exampleBusinessObject" class="examples.ExampleBusinessObject"/>     

 

使用MethodInvokingJobDetailFactoryBean你不需要创建只有一行代码且只调用一个方法的job, 你只需要创建真实的业务对象来包装具体的细节的对象。

 

默认情况下,Quartz Jobs是无状态的,可能导致jobs之间互相的影响。如果你为相同的JobDetail指定两个触发器, 很可能当第一个job完成之前,第二个job就开始了。如果JobDetail对象实现了Stateful接口,就不会发生这样的事情。 第二个job将不会在第一个job完成之前开始。为了使得jobs不并发运行,设置MethodInvokingJobDetailFactoryBean中的concurrent标记为false

 

 

<bean id="methodInvokingJobDetail"   class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">    <property name="targetObject"><ref bean="exampleBusinessObject"/></property>    <property name="targetMethod"><value>doIt</value></property></bean>           

 

注意:默认情况下,jobs在并行的方式下运行。

 

使用triggersSchedulerFactoryBean来包装任务

 

我们已经创建了job details,jobs。我们回顾了允许你调用特定对象上某一个方法的便捷的bean 当然我们仍需要调度这些jobs。这需要使用triggersSchedulerFactoryBean来完成。 Quartz自带一些可供使用的triggersSpring提供两个子类triggers,分别为CronTriggerBeanSimpleTriggerBean

 

Triggers也需要被调度。Spring提供SchedulerFactoryBean来暴露一些属性来设置triggersSchedulerFactoryBean负责调度那些实际的triggers

 

 

两个例子:

 

 

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  <property name="jobDetail">    <!-- see the example of method invoking job above -->        <ref bean="methodInvokingJobDetail"/>  </property>  <property name="startDelay">    <!-- 10 seconds -->    <value>10000</value>  </property>  <property name="repeatInterval">    <!-- repeat every 50 seconds -->    <value>50000</value>  </property></bean><bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  <property name="jobDetail">    <ref bean="exampleJob"/>  </property>  <property name="cronExpression">    <!-- run every morning at 6 am -->    <value>0 6 * * 1</value>  </property></bean>     

 

现在我们创建了两个triggers,其中一个开始延迟10秒以后每50秒运行一次,另一个每天早上6点钟运行。 我们需要创建一个SchedulerFactoryBean来最终实现上述的一切:

 

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  <property name="triggers">    <list>      <ref local="cronTrigger"/>      <ref local="simpleTrigger"/>    </list>  </property></bean>     

 

更多的一些属性你可以通过SchedulerFactoryBean来设置,例如job details使用的Calendars,用来订制Quartz的一些属性以及其它。 你可以看相应的JavaDOC(http://www.springframewor......z/SchedulerFactoryBean.html)来了解进一步的信息。

 

附:cronExpression配置说明

 

 

字段   允许值   允许的特殊字符

 

    0-59    , - * /

    0-59    , - * /

小时    0-23    , - * /

日期    1-31    , - * ? / L W C

月份    1-12 或者 JAN-DEC    , - * /

星期    1-7 或者 SUN-SAT    , - * ? / L C #

年(可选)    留空, 1970-2099    , - * /