一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

使用Quartz調(diào)度器

 歡歡2008 2011-04-27
7.3.2  使用Quartz調(diào)度器
Quartz調(diào)度器為調(diào)度工作提供了更豐富的支持。和Java定時(shí)器一樣,可以使用Quartz來每隔多少毫秒執(zhí)行一個(gè)工作。但Quartz比Java Timer更先進(jìn)之處在于它允許你調(diào)度一個(gè)工作在某個(gè)特定的時(shí)間或日期執(zhí)行。
關(guān)于Quartz的更多信息,可以訪問Quartz位于http://www./quartz的主頁。
讓我們從定義發(fā)送報(bào)表郵件的工作開始使用Quartz:
創(chuàng)建一個(gè)工作
定義Quartz工作的第一步是創(chuàng)建一個(gè)類來定義工作。要做到這一點(diǎn),你需要從Spring的QuartzJobBean中派生子類,如程序清單7.3所示:
 程序清單7.3  定義一個(gè)Quartz工作
 
  public class EmailReportJob extends QuartzJobBean {
 
    public EmailReportJob() {}
 
    protected void executeInternal(JobExecutionContext context)
        throws JobExecutionException {
 
 
   
 
      courseService.sendCourseEnrollmentReport();
    }
 
    private CourseService courseService;
    public void setCourseService(CourseService courseService) {
      this.courseService = courseService;
    }
  }
n
QuartzJobBean是Quartz中與Java的TimerTask等價(jià)的類。它實(shí)現(xiàn)了org.quartz.Job接口。executeInternal()方法定義了當(dāng)預(yù)定的時(shí)刻來臨時(shí)應(yīng)該執(zhí)行哪些動(dòng)作。在這里,正如EmailReportTask,你只是簡(jiǎn)單地調(diào)用了courseService屬性的sendCourseEnrollmentReport()方法。
在Spring配置文件中按以下方式聲明這個(gè)工作:
 
  <bean id="reportJob"
       class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass">
      <value>com.springinaction.training.
           schedule.EmailReportJob</value>
    </property>
    <property name="jobDataAsMap">
      <map>
        <entry key="courseService">
          <ref bean="courseService"/>
        </entry>
      </map>
    </property>
  </bean>
 
值得注意的是,在這里你并沒有直接聲明一個(gè)EmailReportJob Bean,而是聲明了一個(gè)JobDetailBean。這是使用Quartz時(shí)的一個(gè)特點(diǎn)。JobDetailBean是Quartz的org.quartz.JobDetail的子類,它要求通過jobClass屬性來設(shè)置一個(gè)Job對(duì)象。
使用Quartz的JobDetail中的另一個(gè)特別之處是EmailReportJob的courseService屬性是間接設(shè)置的。JobDetail的jobDataAsMap屬性接受一個(gè)java.util.Map,其中包含了需要設(shè)置給jobClass的各種屬性。在這里,這個(gè)map包含了一個(gè)指向courseService Bean的引用,它的鍵值為courseService。當(dāng)JobDetailBean實(shí)例化時(shí),它會(huì)將courseService Bean注入到EmailReportJob的courseService屬性中。
調(diào)度工作
現(xiàn)在工作已經(jīng)被定義好了,接下來你需要調(diào)度這個(gè)工作。Quartz的org.quartz.Trigger類描述了何時(shí)及以怎樣的頻度運(yùn)行一個(gè)Quartz工作。Spring提供了兩個(gè)觸發(fā)器,SimpleTriggerBean和CronTriggerBean。你應(yīng)該使用哪個(gè)觸發(fā)器?讓我們分別考察一下這兩個(gè)觸發(fā)器,首先從SimpleTriggerBean開始。
SimpleTriggerBean與ScheduledTimerTask類似。你可以用它來指定一個(gè)工作應(yīng)該以怎樣的頻度運(yùn)行,以及(可選地)在第一次運(yùn)行工作之前應(yīng)該等待多久。例如,要調(diào)度報(bào)表工作每24小時(shí)運(yùn)行一次,第一次在1小時(shí)之后開始運(yùn)行,可以按照以下方式進(jìn)行聲明:
 
  <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>
 
屬性jobDetail裝配了將要被調(diào)度的工作,在這個(gè)例子中是reportJob Bean。屬性repeatInterval告訴觸發(fā)器以怎樣的頻度運(yùn)行這個(gè)工作(以毫秒作為單位)。這里,我們?cè)O(shè)置它為86400000,因此每隔24小時(shí)它會(huì)被觸發(fā)一次。你也可以選擇設(shè)置startDelay屬性來延遲工作的第一次執(zhí)行。我們?cè)O(shè)置它為3600000,因此在第一次觸發(fā)之前它會(huì)等待1小時(shí)。
調(diào)度一個(gè)cron工作
盡管你可能認(rèn)為SimpleTriggerBean適用于大多數(shù)應(yīng)用,但它仍然不能滿足發(fā)送注冊(cè)報(bào)表郵件的需求。正如ScheduledTimerTask,你只能指定工作執(zhí)行的頻度,而不能準(zhǔn)確指定它于何時(shí)運(yùn)行。因此,你無法使用SimpleTriggerBean在每天早晨6:00給課程主任發(fā)送注冊(cè)報(bào)表郵件。
然而,CronTriggerBean允許你更精確地控制任務(wù)的運(yùn)行時(shí)間。如果你對(duì)Unix的cron工具很熟悉,則會(huì)覺得CronTriggerBean很親切。你不是定義工作的執(zhí)行頻度,而是指定工作的準(zhǔn)確運(yùn)行時(shí)間(和日期)。例如,要在每天早上6:00運(yùn)行報(bào)表工作,可以按照以下方式聲明一個(gè)CronTriggerBean:
 
  <bean id="cronReportTrigger"
       class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail">
      <ref bean="reportJob"/>
    </property>
    <property name="cronExpression">
      <value>0 0 6 * * ?</value>
    </property>
  </bean>
 
和SimpleTriggerBean一樣,jobDetail屬性告訴觸發(fā)器調(diào)度哪個(gè)工作。這里我們又一次裝配了一個(gè)reportJob Bean。屬性cronExpression告訴觸發(fā)器何時(shí)觸發(fā)。如果你不熟悉cron,這個(gè)屬性可能看上去有點(diǎn)神秘,因此讓我們進(jìn)一步考察一下這個(gè)屬性。
一個(gè)cron表達(dá)式有至少6個(gè)(也可能是7個(gè))由空格分隔的時(shí)間元素。從左至右,這些元素的定義如下:
1.秒(0–59)
2.分鐘(0–59)
3.小時(shí)(0–23)
4.月份中的日期(1–31)
5.月份(1–12或JAN–DEC)
6.星期中的日期(1–7或SUN–SAT)
7.年份(1970–2099)
每一個(gè)元素都可以顯式地規(guī)定一個(gè)值(如6),一個(gè)區(qū)間(如9-12),一個(gè)列表(如9,11,13)或一個(gè)通配符(如*)。“月份中的日期”和“星期中的日期”這兩個(gè)元素是互斥的,因此應(yīng)該通過設(shè)置一個(gè)問號(hào)(?)來表明你不想設(shè)置的那個(gè)字段。表7.1中顯示了一些cron表達(dá)式的例子和它們的意義:
表7.1                                            一些cron表達(dá)式的例子
表  達(dá)  式
 意    義
 
0 0 10,14,16 * * ?
 每天上午10點(diǎn),下午2點(diǎn)和下午4點(diǎn)
 
0 0,15,30,45 * 1-10 * ?
 每月前10天每隔15分鐘
 
30 0 0 1 1 ? 2012
 在2012年1月1日午夜過30秒時(shí)
 
0 0 8-5 ? * MON-FRI
 每個(gè)工作日的工作時(shí)間
 
 
對(duì)于cronReportTrigger,我們?cè)O(shè)置cronExpression為0 0 6 * * ?可以把它讀作“在任何月份任何日期(不管是星期幾)的6時(shí)0分0秒執(zhí)行觸發(fā)器。”換句話說,這個(gè)觸發(fā)器會(huì)在每天早晨6:00執(zhí)行。
使用CronTriggerBean完全能夠滿足課程主任的期望了。現(xiàn)在剩下要做的只是啟動(dòng)這個(gè)工作了。
啟動(dòng)工作
Spring的SchedulerFactoryBean是Quartz中與TimerFactoryBean等價(jià)的類。按照如下方式在Spring配置文件中聲明它:
 
  <bean class="org.springframework.scheduling.
         quartz.SchedulerFactoryBean">
    <property name="triggers">
      <list>
        <ref bean="cronReportTrigger"/>
      </list>
    </property>
  </bean>
 
屬性triggers接受一組觸發(fā)器。由于目前只有一個(gè)觸發(fā)器,因此只需簡(jiǎn)單地裝配一個(gè)包含cronReportTrigger Bean的一個(gè)引用的列表即可。
現(xiàn)在,你已經(jīng)實(shí)現(xiàn)了調(diào)度發(fā)送注冊(cè)報(bào)表郵件的需求。但在這個(gè)過程中,你做了一些額外的工作。在開始新的話題之前,首先讓我們看一下如何通過更簡(jiǎn)單一些的方式調(diào)度報(bào)表郵件。
 
本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/welkin8888/archive/2010/11/25/6034078.aspx

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产精品免费视频专区| 午夜视频在线观看日韩| 日韩av欧美中文字幕| 深夜日本福利在线观看| 女生更色还是男生更色| 亚洲午夜福利不卡片在线| 国产亚洲成av人在线观看| 中文字幕无线码一区欧美| 欧美日韩精品久久亚洲区熟妇人| 亚洲美女国产精品久久| 欧美日韩无卡一区二区| 激情图日韩精品中文字幕| 免费精品一区二区三区| 日韩和欧美的一区二区三区| 一区二区三区免费公开| 激情五月综五月综合网| 久久精品国产99精品最新| 亚洲a级一区二区不卡| 99热在线精品视频观看| 91精品欧美综合在ⅹ| 亚洲中文字幕三区四区| 国内外免费在线激情视频| 黄色在线免费高清观看| 免费在线观看激情小视频| 91久久国产福利自产拍| 日本av在线不卡一区| 亚洲午夜av久久久精品| 亚洲国产欧美精品久久| 高清亚洲精品中文字幕乱码| 噜噜中文字幕一区二区| 91日韩欧美在线视频| 日本东京热视频一区二区三区| 亚洲中文字幕三区四区| 欧美国产日韩变态另类在线看| 青青操视频在线观看国产| 青青操日老女人的穴穴| 日本在线视频播放91| 青青操日老女人的穴穴| 亚洲综合一区二区三区在线| 真实偷拍一区二区免费视频 | 日本三区不卡高清更新二区|