Job和JobDetail类定义
使用JobDetailFactoryBean
XML配置文件
<bean name="exampleJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.wilson.demo.job.ExampleJob"></property>
<property name="jobDataAsMap">
<map>
<entry key="timeOut" value="5"></entry>
</map>
</property>
</bean>
jobClass:制定任务对应的类,该类必须继承QuartzJobBean抽象类;
jobDataAsMap:数据承载类,该Map中的属性可注入到jobClass中。
ExampleJob.java
public class ExampleJob extends QuartzJobBean{
private int timeOut;
/**
* @param timeOut the timeOut to set
*/
public void setTimeOut(int timeOut) {
this.timeOut = timeOut;
}
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
System.out.println("ExampleJob>>>>TimeOut value:"+timeOut+",Job running time:"+context.getFireTime());
}
}
使用MethodInvokingJobDetailFactoryBean
XML文件
<bean name="pojoObject" class="com.wilson.demo.job.PoJoExampleJob"></bean>
<bean name="methodJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="pojoObject"></property>
<property name="targetMethod" value="runForJob"></property>
<property name="concurrent" value="false"></property>
</bean>
pojoObject:任务执行类,普通POJO类,不用实现任何接口。需要注意的时,如果该Bean的生命周期是Singleton,则每次任务执行时,都是同一个Bean实例。
targetObject:制定任务的执行类;
targetMethod:制定执行任务时调用的方法;
concurrent:前一个任务未结束时,下一次调用能否开始。
两种方式的比较
JobDetailFactoryBean
- 必须继承QuartzJobBean抽象类;
- 支持往任务执行类中注入属性,任务执行类能获取执行时的上下文环境;
- 通过该工厂Bean创建的JobDetail对象能够序列化,支持持久性的任务,同时,每一次任务调用时均生成新的任务类实例;
- 每次任务调用时,共享同一个JobDetail实例。
MethodInvokingJobDetailFactoryBean
- 支持普通POJO对象,无需继承QuartzJobBean;
- 生成的JobDetail bean无法持久化,不支持持久性的任务;
- 如果targetObject引用的Bean是Singleton,则每次任务调用时,均使用相同的实例bean;
- 每次任务调用时,共享同一个JobDetail实例。
定义Trigger和Scheduler
XML配置
<!-- 简单的Trigger配置,启动延时为10秒,每5秒执行一次任务 -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="methodJobDetail"></property>
<property name="startDelay" value="10000"></property>
<property name="repeatInterval" value="500000000"></property>
</bean>
<!-- 支持表达式的Trigger,每周五,每分钟的第5秒开始,每7秒执行一次,每分钟执行7次 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="exampleJobDetail"></property>
<property name="cronExpression" value="5/7 * * ? * 6"></property>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
<ref bean="simpleTrigger"/>
</list>
</property>
</bean>
Scheduler是具体的任务调度器,而Trigger作为触发器会关联具体的JobDetail对象,通过JobDetail对象知道具体的任务执行类。
CronTrigger的表达式规则:(摘自官方文档-传送门)