首頁  >  文章  >  Java  >  java 定時器幾種方式

java 定時器幾種方式

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

quartz

spring

spring-task

定時任務

註解

 

Spring定時任務的定時,需要每天開發一次前一天的日誌訊息,藉此機會整理了一下定時任務的幾種實現方式,由於專案採用spring框架,所以我都將結合

 

spring框架來介紹。

一.分類

 

從實現的技術上來分類,目前主要有三種技術(或者說有三種產品):

Java自帶的java.util.Timer類,這個類別允許你調度一個java.util.TimerTask任務。使用這種方式可以讓你的程式依照某一個頻度執行,但不能在指定時間運作。一般用的較少,這篇文章將不做詳細介紹。

使用Quartz,這是一個功能比較強大的的調度器,可以讓你的程式在指定時間執行,也可以按照某一個頻度執行,配置起來稍顯複雜,稍後會詳細介紹。

Spring3.0以後自帶的task,可以將它看成一個輕量級的Quartz,而且使用起來比Quartz簡單許多,稍後會介紹。

 

從作業類的繼承方式來講,可以分為兩類:

作業類需要繼承自特定的作業類基類,如Quartz中需要繼承自org.springframework.scheduling.quartz.QuartzJobBean;java .util.Timer中需要繼承自java.util.TimerTask。

作業類即普通的java類,不需要繼承自任何基底類。

 

註:個人建議使用第二種方式,因為這樣所以的類別都是普通類,不需要事先區別對待。

 

 

 

從任務調度的觸發時機來分,這裡主要是針對作業使用的觸發器,主要有以下兩種:

每隔指定時間則觸發一次,在Quartz中觸發的對應器為:org.springframework.scheduling.quartz.SimpleTriggerBean

每到指定時間則觸發一次,在Quartz中對應的調度器為:org.springframework.scheduling.quartz.CronTriggerBean

可以使用這兩種觸發器,如java.util.TimerTask任務就只能使用第一種。 Quartz和spring task都可以支援這兩種觸發條件。

 

 

 

 

二.用法說明

 

詳細介紹每個任務排程工具的使用方式,包括Quartz和spring task兩種。

Quartz

第一種,作業類別繼承自特定的基底類別:org.springframework.scheduling.quartz.QuartzJobBean。

 

第一步:定義作業類別

 

 

Java程式碼 

import org.quartz.JobExecutionContextp. ringframework.scheduling.quartz.QuartzJobBean;

public class Job1 extends QuartzJobBean { 

 

private int timeout; 

private static int i = 0; timeout) { 

this.timeout = timeout; 

 

/**

* 要調度的特定任務

*/ 

@Override text

/\&*/ 

@Override ion { 

  System.out.println( 「定時任務執行中…"); 

 

 第二步驟:spring設定檔中設定作業類別JobDetailBean

ml 代碼碼.scheduling.quartz.JobDetailBean"> 

 

 

 

timeout" value="0" /> 

 

 

 

 

嘿我們在java程式碼中定義的任務類,jobDataAsMap屬性即該任務類中需要注入的屬性值。

 

第三步:配置作業排程的觸發方式(觸發器)

 

Quartz的作業觸發器有兩種,分別是

 

. org.springframework.scheduling.quartz.CronTriggerBean

 

第一種SimpleTriggerBean,只支援依照一定頻率呼叫任務,如每隔30分鐘執行一次。

 

設定方式如下:

 

 

Xml程式碼 

 

 

 

 

第二種CronTriggerBean,如每天12:00運行一次等。

 

配置方式如下:

Xml代碼 

🠟name]z.CronTriggerBean">/m="bjon="brefb; > 

 

 

 

式表達的語法參見附錄。

 

第四步:配置調度工廠

Xml代碼 

 

 

 

 

 

 :此參數指定的名稱為先前配置的觸發器的名字。

 

第五步:啟動你的應用即可,即將工程部署至tomcat或其他容器。

 

 

 

 

第二種,作業類別不繼承特定基底。

 

Spring能夠支持這種方式,歸功於兩個類別:

 

org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean

決定

.

 

這兩個類別分別對應spring支援的兩種實作任務調度的方式,即前文提到到java自帶的timer task方式和Quartz方式。這裡我只寫MethodInvokingJobDetailFactoryBean的用法,使用該類的好處是,我們的任務類不再需要繼承自任何類,而是普通的pojo。

 

第一步:編寫任務類別

Java程式碼 

public class Job2 { 

public void doJob2() { 

System.out.print(rem). ); 

 

 可以看出,這就是一個普通的類,並且有一個方法。

 

第二步:設定作業類別

Xml程式碼 

class="org.springframework.scheduling.quartz.MethodMethodsvoDeattailFactoryageo

 

 

 

 

 

 

 說明:這一步是關鍵步驟,宣告一個MethodInvokingJobDetailFactoryBean,有兩個關鍵屬性:這一步是關鍵步驟,宣告一個MethodInvokingtarDetailFactoryBean,有兩個關鍵屬性:這步驟是指定任務類別,的方法。往下的步驟就與方法一相同了,為了完整,同樣貼出。

 

第三步:配置作業排程的觸發方式(觸發器)

 

Quartz的作業觸發器有兩種,分別是

 

. org.springframework.scheduling.quartz.CronTriggerBean

 

第一種SimpleTriggerBean,只支援依照一定頻率呼叫任務,如每隔30分鐘執行一次。

 

配置方式如下:

Xml代碼 

.🎟name S7@E > 

 

 

 

 

 第二種CronTriggerBean,支援到指定時間執行一次,如每天12:00執行一次等。

 

設定方式如下:

Xml程式碼 

 

 

 

 

 

 

以上兩種調度方式依實際情況,任選一種即可。

 

第四步:配置調度工廠

Xml代碼 

 

 

 

 

 

說明:此參數指定的名稱之前是設定的名稱。

 

第五步:啟動你的應用即可,即將工程部署至tomcat或其他容器。

 

 

 

到此,spring中Quartz的基本配置就介紹完了,當然了,使用之前,要導入相應的spring的包與Quartz的包,這些就不消多說了。

 

其實可以看出Quartz的配置看起來還是挺複雜的,沒有辦法,因為Quartz其實是個重量級的工具,如果我們只是想簡單的執行幾個簡單的定時任務,有沒有更簡單的工具,有!

 

請看我第下文Spring task的介紹。

 

 

Spring-Task

 

上節介紹了在Spring 中使用Quartz,本文介紹Spring3.0以後自主開發的定時任務工具,spring 中使用Quartz,本文介紹Spring3.0以後自主開發的定時任務工具,spring 中使用Quartz,本文介紹Spring3.0以後自主開發的定時任務工具,spring 中使用Quartz,本文介紹Spring3.0以後自主開發的定時任務工具,spring task,可以將它比Quartz ,而且使用起來很簡單,除spring相關的包外不需要額外的包,而且支援註解和設定檔兩種

 

形式,以下將分別介紹這兩種方式。

第一種:設定檔方式

 

第一種:寫作業類別

 

即普通的pojo,如下:

Java

public class TaskJob { 

     

    public void job1() { 

   

 

 第二步:在spring在設定檔中新增命名空間及說明

Xml程式碼 

    xmlns:task="http://www.sp /schema/task"  

    。 。 。 。 。 。

    xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"> 

 :spring設定檔中設定特定的任務

Xml程式碼 

   

         

 

即需要運行的方法,cron及cronExpression表達式,具體寫法這裡不介紹了,詳情請見上篇文章附錄。

 

這個配置不消多說了,spring掃描註解用的。

 

到這裡配置就完成了,是不是很簡單。

第二種:使用註解形式

 

也許我們不想每寫一個任務類別還要在xml檔案中設定下,我們可以使用註解@Scheduled,我們來看看原始檔案中該註解的定義:

Java程式碼 

@Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.ANNOTATION_TYPE}) 

@Retention(RetentionPolicy.RUNTIME) 

@Retention(RetentionPolicy.RUNTIME) 

@Retention(RetentionPolicy.RUNTIME) 

@Retention(RetentionPolicy.RUNTIME) face

face🜎face🠎face蜟{ 

  public abstract String cron(); 

 

  public abstract long fixedDelay(); 

我 

 可以看出註解有三個方法或稱為參數,分別表示的意思是:

 

cron:指定cron表達式

 

fixedDelay:官方文件解釋:An interval-based trigger where the interval is measured from the completion time of the previous task. The time unit value is measured in milliseconds.即表示從上一個任務完成到下一個任務完成的間隔到下一個任務開始的間隔到,單位是毫秒。

 

fixedRate:官方文件解釋:An interval-based trigger where the interval is measured from the start time of the previous task. The time unit value is measured in milliseconds.即從上一個任務開始的任務開始到 milliseconds.即從上一個任務開始的間隔,單位是毫秒。

 

 

 

下面我來設定一下。

 

第一步:寫pojo

Java程式碼 

import org.springframework.scheduling.annotation.Scheduled;   

onent(“taskJob”) 

public class TaskJob { 

    @Scheduled(cron = "0 0 3 * * ?") 

    public void job1() { 

    public void job1() { 🠎

    }

 

 第二步:與task相關的設定:

Xml程式碼 

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/scheSchema-instance" xmlns:aop="http://www.springframework.org/scheSchma /aop" 

    xmlns:context="http://www.springframework.org/schema/context" 

    xmlns:tx="http://www.springframework.org/sche    xmlns:tx="http://www.springframework.org/schema/tx" ="http://www.springframework.org/schema/task" 

    xsi:schemaLocation=" 

        http beans/spring-beans-3.0.xsd 

        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xxsd : /www.springframework.org/schema/context  

http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd 

//www.springframework.org/schema/tx/spring-tx-3.0.xsd 

        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-schema/task http://www.springframework.org/schema/task/spring- task-3.0.xsd" 

    default-lazy-init="false"> 

 

 

  

     

     

 

     

 

說明:理論上只需要加上

 

 

 

 Ok配置完畢,當然spring task還有很多參數,我就不一一解釋了,具體參考xsd文檔http://www.springframework.org/schema/task/task-task 3.0.xsd。

 

附錄:

 

cronExpression的設定說明,具體使用以及參數請百度google

 

     , - * /

 

分0-59    , - * /

 

小時    0-23    , - * /

 

月份    1-12 或 JAN-DEC    , - * /

 

星期    1-7 或 SUN-SAT    , - * ? / L C #

 

年(選購)  

- 區間 

 

* 通配符 

 

? 你不想設定那個欄位

 

下面只例出幾個式子

 

 

 

CRON表達式    意義

 

"0 0 12 * * ?"    每天中午十二點觸發

 

"0 15 1051"

"0 15 10 * * ?"    每天早上10:15觸發

 

"0 15 10 * * ? *"    每天早上10:15觸發

 

🠎"0 15 15觸發

 

🠎"0 15 15

 

"0 * 14 * * ?"    每天從下午2點開始到2點59分每分鐘一次觸發

 

"0 0/5 14 * 55分結束每5分鐘觸發一次

 

"0 0/5 14,18 * * ?"    每天的下午2點至2:55點至6點55分兩個時間段內每5分鐘一次觸發

 

"0 0-5 14 * * ?"    每天14:00至14:05每分鐘一次觸發

 

與14:44觸發

 

"0 15 10 ? * MON-FRI"    每週週一、週二、週三、週四、週五的10:15觸發


java 定時器幾種方式相關文章請關注PHP中文網!


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