Spring中Quartz調度器的使用


一、Quartz的特點

* 作業類的繼承方式來分,主要有以下兩種:

1.作業類繼承org.springframework.scheduling.quartz.QuartzJobBean類的方式

2.作業類不繼承org.springframework.scheduling.quartz.QuartzJobBean類的方式

注:個人比較推崇第二種,因為這種方式下的作業類仍然是POJO。

* 任務調度的觸發時機來分,主要有以下兩種:

1.每隔指定時間則觸發一次,對應的調度器為org.springframework.scheduling.quartz.SimpleTriggerBean

2.每到指定時間則觸發一次,對應的調度器為org.springframework.scheduling.quartz.CronTriggerBean

注:這兩種觸發方式均可以跟兩種作業繼承方式相互組合來使用。

 

下面簡單演示一下在Spring對Quartz的用法。

二、作業類繼承org.springframework.scheduling.quartz.QuartzJobBean類,每到指定時間則觸發一次

1.編寫作業類

package bean.jobDetailBean;

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("繼承QuartzJobBean的方式-調度" + ++i + "進行中...");
}
}

2.配置作業類

<!-- 作業使用繼承QuartzJobBean的方式  -->
<bean name="job1" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="bean.jobDetailBean.Job1" />
<property name="jobDataAsMap">
<map>
<entry key="timeout" value="0" />
</map>
</property>
</bean>

3.配置作業調度的觸發方式

<!-- 對應於作業繼QuartzJobBean類的方式  -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="job1" />

<!--
"cronExpression"的配置說明

字段   允許值   允許的特殊字符
秒    0-59    , - * /
分    0-59    , - * /
小時    0-23    , - * /
日期    1-31    , - * ? / L W C
月份    1-12 或者 JAN-DEC    , - * /
星期    1-7 或者 SUN-SAT    , - * ? / L C #
年(可選)    留空, 1970-2099    , - * /

- 區間 
* 通配符 
? 你不想設置那個字段
-->

<!-- 每分鍾的第0,10,20,30,40,50秒調度一次 -->
<property name="cronExpression" value="0,10,20,30,40,50 * * * * ?" />
</bean>

4.配置調度工廠

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean>

5.開啟調度

package test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ScheduleTest {

public static void main(String[] args){

BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext*.xml");
}
}

6.調度執行的結果

繼承QuartzJobBean的方式-調度1進行中...
繼承QuartzJobBean的方式-調度2進行中...
繼承QuartzJobBean的方式-調度3進行中...
繼承QuartzJobBean的方式-調度4進行中...
繼承QuartzJobBean的方式-調度5進行中...
繼承QuartzJobBean的方式-調度6進行中...
繼承QuartzJobBean的方式-調度7進行中...
繼承QuartzJobBean的方式-調度8進行中...
繼承QuartzJobBean的方式-調度9進行中...

三、作業類不繼承org.springframework.scheduling.quartz.QuartzJobBean類,每隔指定時間則觸發一次

1.編寫作業類

package bean.jobDetailBean;

public class Job2 {

private static int i = 0;

public void doJob2() {

System.out.println("不繼承QuartzJobBean方式-調度" + ++i + "進行中...");
}
}

2.配置作業類

<bean id="job2"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<bean class="bean.jobDetailBean.Job2" />
</property>
<property name="targetMethod" value="doJob2" />
<property name="concurrent" value="false" /><!-- 作業不並發調度 -->
</bean>

3.配置作業調度的觸發方式

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="job2" />
<property name="startDelay" value="0" /><!-- 調度工廠實例化后,經過0秒開始執行調度 -->
<property name="repeatInterval" value="2000" /><!-- 每2秒調度一次 -->
</bean>

4.配置調度工廠

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
</list>
</property>
</bean>

5.開啟調度

package test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ScheduleTest {

public static void main(String[] args){

BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext*.xml");
}
}

6.調度執行的結果

不繼承QuartzJobBean方式-調度1進行中...
不繼承QuartzJobBean方式-調度2進行中...
不繼承QuartzJobBean方式-調度3進行中...
不繼承QuartzJobBean方式-調度4進行中...
不繼承QuartzJobBean方式-調度5進行中...
不繼承QuartzJobBean方式-調度6進行中...
不繼承QuartzJobBean方式-調度7進行中...
不繼承QuartzJobBean方式-調度8進行中...
不繼承QuartzJobBean方式-調度9進行中...
不繼承QuartzJobBean方式-調度10進行中...

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM