熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Spring定時器的兩種實現方式

2013-11-23 19:21:36  來源: Java核心技術 

  有兩種流行Spring定時器配置Java的Timer類和OpenSymphony的Quartz

  Java Timer定時

  首先繼承javautilTimerTask類實現run方法

  import javautilTimerTask;

  public class EmailReportTask extends TimerTask{

  @Override

  public void run() {

  

  }

  }

  在Spring定義

  

  配置Spring定時器

  <bean id=scheduleReportTask class=orgspringframeworkschedulingtimerScheduledTimerTask>

  <property name=timerTask ref=reportTimerTask />

  <property name=period>

  <value>value>

  property>

  bean>

  timerTask屬性告訴ScheduledTimerTask運行哪個代表個小時

  啟動Spring定時器

  Spring的TimerFactoryBean負責啟動定時任務

  <bean class=orgspringframeworkschedulingtimerTimerFactoryBean>

  <property name=scheduledTimerTasks>

  <list><ref bean=scheduleReportTask/>list>

  property>

  bean>

  scheduledTimerTasks裡顯示一個需要啟動的定時器任務的列表

  可以通過設置delay屬性延遲啟動

  <bean id=scheduleReportTask class=orgspringframeworkschedulingtimerScheduledTimerTask>

  <property name=timerTask ref=reportTimerTask />

  <property name=period>

  <value>value>

  property>

  <property name=delay>

  <value>value>

  property>

  bean>

  這個任務我們只能規定每隔小時運行一次無法精確到某時啟動

  Quartz定時器

  首先繼承QuartzJobBean類實現executeInternal方法

  import orgquartzJobExecutionContext; import orgquartzJobExecutionException; import orgspringframeworkschedulingquartzQuartzJobBean;

  public class EmailReportJob extends QuartzJobBean{

  protected void executeInternal(JobExecutionContext arg)

  throws JobExecutionException {

  

  }

  }

  在Spring中定義

  <bean id=reportJob class=orgspringframeworkschedulingquartzJobDetailBean>

  <property name=jobClass>

  <value>EmailReportJobvalue>

  property>

  <property name=jobDataAsMap>

  <map>

  <entry key=courseService>

  <ref bean=courseService/>

  entry>

  map>

  property>

  bean>

  在這裡我們並沒有直接聲明一個EmailReportJob Bean而是聲明了一個JobDetailBean這個是Quartz的特點JobDetailBean是Quartz的orgquartzJobDetail的子類它要求通過jobClass屬性來設置一個Job對象

  使用Quartz的JobDetail中的另一個特別之處是EmailReportJob的courseService屬性是間接設置的JobDetail的jobDataAsMap屬性接受一個Map包括設置給jobClass的各種屬性JobDetailBean實例化時它會將courseService Bean注入到EmailReportJob 的courseService 屬性中

  啟動定時器

  Quartz的orgquartzTrigger類描述了何時及以怎樣的頻度運行一個Quartz工作Spring提供了兩個觸發器SimpleTriggerBean和CronTriggerBean

  SimpleTriggerBean與scheduledTimerTasks類似指定工作的執行頻度模仿scheduledTimerTasks配置

  <bean id=simpleReportTrigger class=orgspringframeworkschedulingquartzSimpleTriggerBean>

  <property name=jobDetail ref=reprotJob />

  <property name=startDelay>

  <value>value>

  property>

  <property name=repeatInterval>

  <value>value>

  property>

  bean>

  startDelay也是延遲個小時啟動

  CronTriggerBean指定工作的准確運行時間

  <bean id=cronReportTrigger class=orgspringframeworkschedulingquartzCronTriggerBean>

  <property name=jobDetail ref=reprotJob />

  <property name=cronExpression>

  <value> * * ?value>

  property>

  bean>

  屬性cronExpression告訴何時觸發最神秘就是cron表達式

  Linux系統的計劃任務通常有cron來承擔一個cron表達式有至少個(也可能個)有空格分隔的時間元素從左到右

  小時月份中的日期()月份(或JANDEC)星期中的日期(或SUNSAT)年份()

  每個元素都顯示的規定一個值(如)一個區間()一個列表()或一個通配符(*)因為這兩個元素是互斥的因此應該通過設置一個問號(?)來表明不想設置的那個字段/如果值組合就表示重復次數(/表示每秒重復次)

  啟動定時器

  <bean class=orgspringframeworkschedulingquartzSchedulerFactoryBean>

  <property name=triggers>

  <list><ref bean=cronReportTrigger/>list>

  property>

  bean>

  triggers屬性接受一組觸發器


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26716.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.