首頁  >  文章  >  Java  >  JAVA中 Spring定時器的兩種實作方式

JAVA中 Spring定時器的兩種實作方式

高洛峰
高洛峰原創
2016-12-16 13:16:581235瀏覽

目前有兩種流行Spring定時器配置:Java的Timer類別和OpenSymphony的Quartz。

1.Java Timer定時

首先繼承java.util.TimerTask類別實作run方法

import java.util.TimerTask; 
public class EmailReportTask extends TimerTask{ 
  @Override 
  public void run() { 
    ... 
  }  
}

在Spring定義

ScheduledTimerTask運行哪個。 86400000代表24小時

啟動Spring定時器

Spring的TimerFactoryBean負責啟動定時任務

<bean id="scheduleReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> 
<property name="timerTask" ref="reportTimerTask" /> 
<property name="period"> 
<value>86400000value> 
property> 
bean>

   

scheduledTimerasks完成的定時器清單。

可以透過設定delay屬性延遲啟動 

<bean class="org.springframework.scheduling.timer.TimerFactoryBean"> 
<property name="scheduledTimerTasks"> 
  <list><ref bean="scheduleReportTask"/>list> 
property> 
bean>

   

這個任務我們只能規定每隔24小時運作一次,無法精確到某時啟動以下完成設定器方法

<bean id="scheduleReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> 
<property name="timerTask" ref="reportTimerTask" /> 
<property name="period"> 
<value>86400000value> 
property> 
<property name="delay"> 
<value>3600000value> 
property> 
bean>

   

在Spring中定義

import org.quartz.JobExecutionContext; 
import org.quartz.JobExecutionException; 
import org.springframework.scheduling.quartz.QuartzJobBean; 
public class EmailReportJob extends QuartzJobBean{ 
protected void executeInternal(JobExecutionContext arg0) 
throws JobExecutionException { 
... 
} 
}

   

在這裡我們並沒有直接聲明一個EmailReportJob,而是聲明了一個JobDetail Beanean。這個是Quartz的特點。 JobDetailBean是Quartz的org.quartz.JobDetail的子類,它要求透過jobClass屬性來設定一個Job物件。

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

啟動定時器

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

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

<bean id="reportJob" class="org.springframework.scheduling.quartz.JobDetailBean"> 
<property name="jobClass"> 
<value>EmailReportJobvalue> 
property> 
<property name="jobDataAsMap"> 
  <map> 
    <entry key="courseService"> 
      <ref bean="courseService"/> 
      entry> 
  map> 
property> 
bean>

   

startDelay也是延遲1個小時啟動

CronTriggerBcupronTrigger

startDelay也是延遲1個小時啟動

觸發。最神秘就是cron表達式:

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

1.秒2.分3.小時4.月份中的日期(1-31)5.月份(1-12或JAN-DEC)6.星期中的日期(1-7或SUN-SAT)7.年份(1970-2099) 

每個元素都顯示的規定一個值(如6),一個區間(9-12),一個列表(9,11,13)或一個通配符(*) 。因為4和6這兩個元素是互斥的,因此應該透過設定一個問號(?)來表示不想設定的那個字段,「/」如果值組合就表示重複次數(10/6表示每10秒重複6次)。

啟動定時器

<bean id="simpleReportTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 
<property name="jobDetail" ref="reprotJob" /> 
<property name="startDelay"> 
<value>360000value> 
property> 
<property name="repeatInterval"> 
  <value>86400000value> 
property> 
bean>

   

triggers屬性接受一組觸發器。

好了,本文內容到此結束了,寫的還不錯吧,有不足之處,歡迎各位大俠提出寶貴意見。


更多JAVA中 Spring定時器的兩種實現方式相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn