使用 MethodInvokingJobDetailFactoryBean


如 果您使用Spring的話,您並不一定要繼承QuartzJobBean類別來定義一個Job類別,Spring提供 org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean, 可以讓您直接指定呼叫某個物件的方法,例如改寫一下 使用 Quartz 的DemoJob類別:
  • DemoJob.java
package onlyfun.caterpillar;

public class DemoJob {
private JobData jobData;

public void execute() {
System.out.println(
jobData.getData() + " is executed.");
}

public void setJobData(JobData jobData) {
this.jobData = jobData;
}

public JobData getJobData() {
return jobData;
}
}

接著只要在Bean定義檔中使用MethodInvokingJobDetailFactoryBean即可,例如改寫一下QuartzDemo專案中的beans-config.xml:
  • beans-config.xml
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="someData"
class="onlyfun.caterpillar.JobData"/>

<bean id="someJob"
class="onlyfun.caterpillar.DemoJob">
<property name="jobData">
<ref bean="someData"/>
</property>
</bean>

<bean id="jobDetailBean"
class="org.springframework.scheduling.
→ quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="someJob"/>
</property>
<property name="targetMethod">
<value>execute</value>
</property>
</bean>

<bean id="cronTriggerBean"
class="org.springframework.scheduling.
→ quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="jobDetailBean"/>
</property>
<property name="cronExpression">
<value>0 30 18 * * ?</value>
</property>
</bean>

<bean id="schedulerFactoryBean"
class="org.springframework.scheduling.
→ quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerBean"/>
</list>
</property>
</bean>
</beans>

在上面的指定中,每天的18時30分都會執行指定的任務,在底層,MethodInvokingJobDetailFactoryBean會自動建立JobDetail的實例以呼叫目標物件的指定方法。