Spring中Quartz調度器的使用

1、Quartz的特色java

做業類的繼承方式來分,主要有如下兩種:spring

1.做業類繼承org.springframework.scheduling.quartz.QuartzJobBean類的方式併發

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

注:我的比較推崇第二種,由於這種方式下的做業類仍然是POJO。ide

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

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

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

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

 

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

2、做業類繼承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進行中...

3、做業類不繼承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進行中...


使用Spring配置管理Quartz的時候會遇到下面的異常:

Caused by: java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.CronTriggerBean has interface org.quartz.CronTrigger as super class  


緣由是Spring 3.0版本中內置的Quartz版本是<2.0的,在使用最新的Quartz包(>2.0)以後,接口不兼容。


解決辦法有兩種:

1.下降Quartz版本,降到1.X去。

2.升級Spring版本到3.1+,根據Spring的建議,將原來的**TriggerBean替換成**TriggerFactoryBean,例如CronTriggerBean 就能夠替換成 CronTriggerFactoryBean。替換以後問題解決。


轉自:http://blog.csdn.net/linjiaxingqqqq/article/details/7523777

http://blog.csdn.net/shootyou/article/details/8175754 

相關文章
相關標籤/搜索