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();
}
}
现在我们必须要来定义运行调度任务的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参数,任务会在这里进行注册。