`
no_bao
  • 浏览: 309753 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Quartz使用指南(七)-----Spring中使用Quartz进行作业调度

 
阅读更多

 

1             Spring中使用Quartz进行作业调度

Spring提供了支持时序调度(Scheduling)的整合类.现在,时序调度器通过FactoryBean建立,保持着可选的对Timers或者Triggers的引用。更进一步的, 对于Quartz SchedulerTimer两者存在一个方便的类允许我们调用目标对象(类似于通常的MethodInvokingFactoryBeans)上的某个方法。

1.1         使用JobDetailBean

JobDetail 对象包括了运行一个job所需要的所有信息。 于是Spring提供了一个所谓的JobDetailBean使得JobDetail拥有了一个真实的,有意义的默认值。让我们来看个例子:

<bean name="exampleJob" class="org.springframework.scheduling.quartz.JobDetailBean">

  <property name="jobClass">

    <value>example.ExampleJob</value>

  </property>

  <property name="jobDataAsMap">

    <map>

      <entry key="timeout"><value>5</value></entry>

    </map>

  </property>

</bean>

Job detail bean拥有所有运行job(ExampleJob)的必要信息。通过jobdata map来制定timeout Jobdata map可以通过JobExecutionContext(在运行时刻传递给你)来得到, 但是JobDetailBean也把从jobdata map中得到的属性映射到实际job中的属性中去。 所以,如果ExampleJob中包含一个名为timeout的属性,JobDetailBean将自动为它赋值:

package example;

 

public class ExampleJob extends QuartzJobBean {

 

  private int timeout;

 

  /**

   * Setter called after the ExampleJob is instantiated

   * with the value from the JobDetailBean (5)

   */

  public void setTimeout(int timeout) {

    this.timeout = timeout;

  }

    protected void executeInternal(JobExecutionContext ctx)

  throws JobExecutionException {

        // do the actual work

  }

}

所有Job detail bean中的一些其他的设定对你来说也是可以同样设置的.

注意:使用namegroup属性,你可以修改job在哪一个组下运行和使用什么名称。 默认情况下,job的名称等于job detai bean的名称(在上面的例子中为exampleJob)。

1.2         使用MethodInvokingJobDetailFactoryBean

通常情况下,你只需要调用特定对象上的一个方法。你可以使用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在并行的方式下运行。

1.3   使用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>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics