Posted on 2008-08-18 17:04
beauty9235 閱讀(4229)
評論(0) 編輯 收藏
作者:
beauty9235
鏈接:
http://beauty9235.javaeye.com/blog/229617
發表時間: 2008年08月08日
聲明:本文系JavaEye網站發布的原創博客文章,未經作者書面許可,嚴禁任何網站轉載本文,否則必將追究法律責任!
spring 任務調度總結
參考資料
http://www.ibm.com/developerworks/cn/java/j-quartz/
http://www.opensymphony.com/quartz/download.action
Java的Timer類和OpenSymphony的Quartz調度器是兩個流行的調度API。Spring為這兩個調度器提供了一個抽象層,可以更容易的使用他們
spring+timer
1 .使用java Timer調度任務
第一步 web.xml
<!--*********************** spring setting ***********************-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/applicationContextTimeTask.xml
</param-value>
</context-param>
第二步 配置applicationContextTimeTask.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<beans>
<!--
****************使用java Timer調度任務*********************
使用java Timer調度第一步是從java.util.TimerTask派生一個任務
聲明本身只是將EmailReportTask放到應用上下文,
并在testBean屬性裝配TestBean
在調度之前不會做任何事。
-->
<bean id="testBean" class="com.photo.test.TestBean"/>
<bean id="reportTimerTask" class="com.photo.task.EmailReportTask">
<property name="testBean">
<ref bean="testBean"/>
</property>
</bean>
<!--
Spring的ScheduledTimerTimerTask定義了一個定時器任務的運行周期。應該如下裝配一個ScheduledTimerTask
timerTask告訴ScheduledTimerTask運行哪個TimerTask,
這里該裝配屬性指向reportTimerTask的一個引用。
屬性period告訴ScheduledTimerTask以怎樣的頻率調用TimerTask的run()方法。
這個屬性以毫秒作為單位,
86400000指定該任務每24小時運行一次
10X1000
屬性scheduledTimerTasks 要求一個需要啟動的定時器任務列表。
ScheduledTimerTask有一個delay屬性, 允許你指定當任務第一次運行之前應該等多久。
如,EmailReportTask的第一次運行延遲5毫秒
-->
<bean id="scheduledReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask">
<ref bean="reportTimerTask"/>
</property>
<property name="period">
<value>10000</value>
</property>
<property name="delay">
<value>5000</value>
</property>
</bean>
<!--Spring 的TimerFactoryBean負責啟動定時任務。按以下方式在Spring配置文件里聲明它-->
<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="scheduledReportTask"/>
</list>
</property>
</bean>
</beans>
第三步 相關類的編寫
EmailReportTask.java
public class EmailReportTask extends TimerTask {//必需繼承TimerTask
Log log= LogFactory.getLog(EmailReportTask.class);
public EmailReportTask() {
}
public void run() {//這個函數是調度任務執行的入口
log.debug("task begin :"+testBean.greeting);
}
private TestBean testBean;//這里實現spring的依賴注入
public void setTestBean(TestBean testBean) {
this.testBean = testBean;
}
}
testBean.java
public class TestBean {
public String greeting="hello,world";
}
spring+Quartz
Quartz 作業調度框架所提供的 API 在兩方面都表現極佳:既全面強大,又易于使用。Quartz 可以用于簡單的作業觸發,也可以用于復雜的 JDBC 持久的作業存儲和執行。
第一步 同上
第二步 配置applicationContextTimeTask.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<beans>
<bean id="reportJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.photo.task.EmailReportTask2</value>
</property>
<property name="jobDataAsMap">
<map>
<entry key="testBean">
<ref bean="testBean"/>
</entry>
</map>
</property>
</bean>
<!--用它來指定一個工作應以怎樣的頻率運行,及第一次運行工作前應等多久-->
<bean id="simpleReportTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail">
<ref bean="reportJob"/>
</property>
<property name="startDelay">
<value>3600000</value>
</property>
<property name="repeatInterval">
<value>86400000</value>
</property>
</bean>
<!--
CronTriggerBean允許更精確的控制任務的運行時間。如果要在每天的6:00運行任務可以按照以下方式聲明一個CronTriggerBean
0 0 6 * * ?
jobDetail屬性告訴觸發器調度哪一個工作,屬性cronExpression告訴觸發器何時觸發。一個cron表達式至少有6個由空格分隔的時間元素(最多7個)從左到右元素定義如下
1。秒(0-59)
2。分(0-59)
3。小時(0-23)
4。月份中的日期(1-31)
5。月份(1-12 或 JAN-DEC)
6。星期(1-7 或 SUN-SAT)
7。年份(1970-2099)
每一個元素都可以顯示規定的一個值,一個區間(9-14),一個列表(9,12,14)或一個通配符(*)月份中的日期和星期中的日期這兩個元素時互斥的一起應該通過設置一個問號(?)來表明不想設置那個字段
對于cronReportTrigger我們設置的cronExpression為 0 0 6 * * ?可以讀作任意月份任何日期的6時0分0秒執行觸發器
-->
<bean id="cronReportTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="reportJob"/>
</property>
<property name="cronExpression">
<value>0/5 * * * * ?</value>
</property>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronReportTrigger"/>
</list>
</property>
</bean>
</beans>
第三步 相關類的編寫
EmailReportTask2.java
public class EmailReportTask2 extends QuartzJobBean {
Log log = LogFactory.getLog(EmailReportTask.class);
public EmailReportTask2() {
}
//這個函數是調度任務執行的入口
protected void executeInternal(JobExecutionContext jobExecutionContext) throws org.quartz.JobExecutionException {
log.debug("task 2 begin :" + testBean.greeting);
}
private TestBean testBean;//這里實現spring的依賴注入
public void setTestBean(TestBean testBean) {
this.testBean = testBean;
}
}
TestBean.java 同上
本文的討論也很精彩,瀏覽討論>>
JavaEye推薦