ITEEDU

使用 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 的实例以呼叫目标物件的指定方法。