JDK 定时器和 Quartz 展示(4)

5 Quartz调度器 5.1 Quartz调度器任务

为了使用Quartz调度器来丰富我们的例子,首先我们必须设置一个Quartzs调度器任务。可以用两种方式实现这一工作。第一种方式是在applicationContext.xml中把调度任务定义成Spring的一个bean。这个bean可以是一个org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean类,有两个配置参数targetObject和targetMethod,就像我们在上一步中所做的一样。不过,让我们来尝试一个更加复杂的调度器吧。我们仅需创建一个类来继承org.springframework.scheduling.quartz.QuartzJobBean,就可以实现我们自己的两个调度器。MyTask.java可以通过一个setter方法传递给调度器。随后,任务里的方法会在继承自QuartzJobBean的调度任务的executeInternal(JobExecutionContext context)方法中被调用。

QuartzJob.java

package com.javacodegeeks.snippets.enterprise.quartz;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

import com.javacodegeeks.snippets.enterprise.MyTask;

public class QuartzJob extends QuartzJobBean {
 
 private MyTask myTask;

public void setMyTask(MyTask myTask) {
  this.myTask = myTask;
 }

protected void executeInternal(JobExecutionContext context)
  throws JobExecutionException {
  myTask.sayHello();
 }
}

5.2 Quartz触发器

现在我们必须要来定义运行调度任务的Quartz触发器了。Quartz提供了两个类来实现触发器部分。在org.springframework.scheduling.quartz.SimpleTriggerBean中我们可以设置startTime,endTime和intervals来运行任务,而在org.springframework.scheduling.quartz.CronTriggerBean则支持UNIX的cron表达式来指定任务运行的时间。两种触发器类型都被定义成Spring的bean,而且两者都提供了一个jobDetail参数来设置对调度任务的引用。

还有一个配置工作是创建一个SchedulerFactoryBean,它可以整合调度任务和触发器。所以两个bean都被包含在SchedulerFactoryBean的定义中。

在applicationContext.xml中我们定义了所有的的bean,包括调度任务、触发器和SchedulerFactoryBean。

applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
 xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
 xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:task="http://www.springframework.org/schema/task"
 xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/beans http://www.springframework.org/schema/context http://www.springframework.org/schema/jee http://www.springframework.org/schema/tx http://www.springframework.org/schema/task ">


 <bean />

<!-- quartz -->
 <bean>
  <property value="com.javacodegeeks.snippets.enterprise.quartz.QuartzJob" />
  <property>
    <map>
   <entry key="myTask" value-ref="myTask" />
    </map>
  </property>
 </bean>
 
 <bean>
  <property ref="quartzJob" />
  <property value="5000" />
  <property value="1000" />
 </bean>
 
 <bean>
   <property ref="quartzJob" />
  <property value="0/5 * * * * ?" />
 </bean>
 
 <bean>
  <property>
   <list>
    <ref bean="quartzJob" />
   </list>
  </property>
  <property>
   <list>
    <ref bean="cronTrigger" />
   </list>
  </property>
 </bean>
</beans>

注意,我们添加的两个触发器的实现,在SchedulerFactoryBean中只使用了其中一个。cronTrigger是org.springframework.scheduling.quartz.CronTriggerBean类型的实现,而simpleTrigger是org.springframework.scheduling.quartz.SimpleTriggerBean类型的实现。在SchedulerFactoryBean类型的bean的triggers参数中设置了对cronTrigger的引用,而在jobDetails参数中设置了对调度任务的引用。

需要注意的另外一件事是,名为quartzJob的bean的定义。这里通过一个参数把Quartz任务类设定为org.springframework.scheduling.quartz.JobDetailBean类。该类有一个jobDataAsMap参数,任务会在这里进行注册。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ccca22d81f838e2db903c6c2089db677.html