一、任务调度的触发时机
1.每隔指定时间则触发一次
Quartz中对应的触发器为org.springframework.scheduling.quartz.SimpleTriggerBean
2.每到指定时间则触发一次
Quartz中对应的调度器为:org.springframework.scheduling.quartz.CronTriggerBean
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="job1" /> <!―每天12:00运行一次 ―> <property name="cronExpression" value="0 0 12 * * ?" /> </bean>
并非每种任务都可以使用这两种触发器,如java.util.TimerTask任务就只能使用第一种。Quartz和spring task都可以支持这两种触发条件。
二、Quartz作业类的继承方式
1.作业类继承自特定的基类
作业类继承于org.springframework.scheduling.quartz.QuartzJobBean
第一步:定义作业类
import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; public class Job1 extends QuartzJobBean { private int timeout; private static int i = 0; // 调度工厂实例化后,经过timeout时间开始执行调度 public void setTimeout(int timeout) { this.timeout = timeout; } /** * 要调度的具体任务 */ @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("定时任务执行中…"); } }
第二步:配置spring配置文件中作业类JobDetailBean
<bean name="job1" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="com.mark.Job1" /> <!--在java代码中定义的任务类--> <property name="jobDataAsMap"> <map> <entry key="timeout" value="0" /> <!--该任务类中需要注入的属性值--> </map> </property> </bean>
第三步:配置作业调度的触发方式(触发器)
SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次
第二种 CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="job1" /> <!―每天12:00运行一次 ―> <property name="cronExpression" value="0 0 12 * * ?" /> </bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger" /> <!--指定的就是之前配置的触发器的名字--> </list> </property> </bean>
2.作业类即普通的java类,不需要继承自任何基类(推荐)
spring支持的两种实现任务调度的方式
org.springframework.scheduling.timer.java自带timer task方式
org.springframework.scheduling.quartz.Quartz方式
第一步:编写任务类
public class Job2 { public void doJob2() { System.out.println("不继承QuartzJobBean方式-调度进行中…"); } }
第二步:配置spring配置文件中作业类MethodInvokingJobDetailFactoryBean
<bean id="job2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <bean class="com.mark.Job2" /> <!--指定任务类--> </property> <property name="targetMethod" value="doJob2" /> <!--指定运行的方法--> <property name="concurrent" value="false" /> <!-- 作业不并发调度 --> </bean>
第三步:配置作业调度的触发方式(触发器)
SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次
第二种 CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="job2" /> <!―每天12:00运行一次 ―> <property name="cronExpression" value="0 0 12 * * ?" /> </bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger" /> <!--指定的就是之前配置的触发器的名字--> </list> </property> </bean>
文章来源: Quartz之使用案例