Java之美[從菜鳥到高手演變]之Spring中Quartz調度器的使用

本文轉載自http://www.cnblogs.com/mguo/archive/2013/01/16/2862921.html

====================================================

一、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");
   }
}

三、作業類不繼承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");
  }
}

簡單說明Spring自帶調度器的例子。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章