1. 程式人生 > >Quartz學習記錄(一)

Quartz學習記錄(一)

記錄 lib jobdetail 遞增 引入 指定 sim 其中 基於

1.quartz介紹和下載

官網:http://www.quartz-scheduler.org/

QuartzOpenSymphony開源組織在Job scheduling領域又一個開源項目,它可以與J2EEJ2SE應用程序相結合也可以單獨使用。Quartz可以用來創建簡單或為運行十個,百個,甚至是好幾萬個Jobs這樣復雜的程序。Jobs可以做成標準的Java組件或 EJBsQuartz的最新版本為Quartz 2.2.3

下載壓縮包:

技術分享圖片

2.入門案例

第一步:創建maven工程,導入springquartz相關依賴

<!-- 引入quartz對應的依賴  -->
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId
> <artifactId>quartz-jobs</artifactId> <version>2.2.3</version> </dependency>

第二步:創建任務類

/**
 * 自定義作業類
 * @author Yukai Fan
 *
 */
public class myJob {
    public void run() {
        System.out.println("自定義的作業類執行了:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new
Date())); } }

第三步:在spring配置文件中配置任務類

<!-- 註冊自定義作業類 -->
    <bean id="myJob" class="com.javaweb.quartz.myJob"></bean>
    
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!-- 註入目標對象 -->
        <property name="targetObject" ref="myJob" />
        <!-- 註入目標方法 -->
        <property name="targetMethod" value="run"/>
    </bean>
    
    <!-- 配置觸發器 -->
    <bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!-- 註入任務詳情對象 -->
        <property name="jobDetail" ref="jobDetail"/>
        <!-- 註入cron表達式,通過這個表達式指定觸發的時間點 -->
        <property name="cronExpression">
            <!-- 每五秒執行一次 -->
            <value>0/5 * * * * ?</value>
        </property>
    </bean>
    
    <!-- 配置scheduler調度工長-->
    <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <!-- 註入觸發器 -->
        <property name="triggers">
            <list>
                <ref bean="myTrigger"/>
            </list>
        </property>        
    </bean>

第四步:加載spring配置文件,創建spring工廠

public class App {
    public static void main(String[] args) {
        new ClassPathXmlApplicationContext("applicationContext.xml");
    }
}

3.cron表達式

Quartz cron 表達式的格式十分類似於 UNIX cron 格式,但還是有少許明顯的區別。區別之一就是 Quartz 的格式向下支持到秒級別的計劃,而 UNIX cron 計劃僅支持至分鐘級。許多我們的觸發計劃要基於秒級遞增的(例如,每45),因此這是一個非常好的差異。

UNIX cron 裏,要執行的作業(或者說命令)是存放在 cron 表達式中的,在第六個域位置上。Quartz cron 表達式存放執行計劃。引用了 cron 表達式的 CronTrigger 在計劃的時間裏會與 job 關聯上。

另一個與 UNIX cron 表達式的不同點是在表達式中支持域的數目。UNIX 給出五個域(分、時、日、月和周)Quartz 提供七個域。表 5.1 列出了 Quartz cron 表達式支持的七個域。

Quartz Cron 表達式支持到七個域

名稱

是否必須

允許值

特殊字符

0-59

, - * /

0-59

, - * /

0-23

, - * /

1-31

, - * ? / L W C

1-12 或 JAN-DEC

, - * /

1-7 或 SUN-SAT

, - * ? / L C #

空 或 1970-2099

, - * /

月份和星期的名稱是不區分大小寫的。FRI fri 是一樣的。

域之間有空格分隔,這和 UNIX cron 一樣。無可爭辯的,我們能寫的最簡單的表達式看起來就是這個了:

* * * ? * *

這個表達會每秒鐘(每分種的、每小時的、每天的)激發一個部署的 job

·理解特殊字符

UNIX cron 一樣,Quartz cron 表達式支持用特殊字符來創建更為復雜的執行計劃。然而,Quartz 在特殊字符的支持上比標準 UNIX cron 表達式更豐富了。

* 星號

使用星號(*) 指示著你想在這個域上包含所有合法的值。例如,在月份域上使用星號意味著每個月都會觸發這個 trigger

表達式樣例:

0 * 17 * * ?

意義:每天從下午5點到下午5:59中的每分鐘激發一次 trigger。它停在下午 5:59 是因為值 17 在小時域上,在下午 6 點時,小時變為 18 了,也就不再理會這個 trigger,直到下一天的下午5點。

在你希望 trigger 在該域的所有有效值上被激發時使用 * 字符。

? 問號

? 號只能用在日和周域上,但是不能在這兩個域上同時使用。你可以認為 ? 字符是 "我並不關心在該域上是什麽值。" 這不同於星號,星號是指示著該域上的每一個值。? 是說不為該域指定值。

不能同時這兩個域上指定值的理由是難以解釋甚至是難以理解的。基本上,假定同時指定值的話,意義就會變得含混不清了:考慮一下,如果一個表達式在日域上有值11,同時在周域上指定了 WED。那麽是要 trigger 僅在每個月的11號,且正好又是星期三那天被激發?還是在每個星期三的11號被激發呢?要去除這種不明確性的辦法就是不能同時在這兩個域上指定值。

只要記住,假如你為這兩域的其中一個指定了值,那就必須在另一個字值上放一個 ?

表達式樣例:

0 10,44 14 ? 3 WEB

意義:在三月中的每個星期三的下午 2:10 和 下午 2:44 被觸發。

, 逗號

逗號 (,) 是用來在給某個域上指定一個值列表的。例如,使用值 0,15,30,45 在秒域上意味著每15秒觸發一個 trigger

表達式樣例:

0 0,15,30,45 * * * ?

意義:每刻鐘觸發一次 trigger

/ 斜杠

斜杠 (/) 是用於時間表的遞增的。我們剛剛用了逗號來表示每15分鐘的遞增,但是我們也能寫成這樣 0/15

表達式樣例:

0/15 0/30 * * * ?

意義:在整點和半點時每15秒觸發 trigger

- 中劃線

中劃線 (-) 用於指定一個範圍。例如,在小時域上的 3-8 意味著 "3,4,5,6,7 8 點。" 域的值不允許回卷,所以像 50-10 這樣的值是不允許的。

表達式樣例:

0 45 3-8 ? * *

意義:在上午的3點至上午的8點的45分時觸發 trigger

L 字母

L 說明了某域上允許的最後一個值。它僅被日和周域支持。當用在日域上,表示的是在月域上指定的月份的最後一天。例如,當月域上指定了 JAN 時,在日域上的 L 會促使 trigger 131號被觸發。假如月域上是 SEP,那麽 L 會預示著在930號觸發。換句話說,就是不管指定了哪個月,都是在相應月份的時最後一天觸發 trigger

表達式 0 0 8 L * ? 意義是在每個月最後一天的上午 8:00 觸發 trigger。在月域上的 * 說明是 "每個月"

L 字母用於周域上,指示著周的最後一天,就是星期六 (或者數字7)。所以如果你需要在每個月的最後一個星期六下午的 11:59 觸發 trigger,你可以用這樣的表達式 0 59 23 ? * L

當使用於周域上,你可以用一個數字與 L 連起來表示月份的最後一個星期 X。例如,表達式 0 0 12 ? * 2L 說的是在每個月的最後一個星期一觸發 trigger

不要讓範圍和列表值與 L 連用

雖然你能用星期數(1-7)與 L 連用,但是不允許你用一個範圍值和列表值與 L 連用。這會產生不可預知的結果。


W 字母

W 字符代表著平日 (Mon-Fri),並且僅能用於日域中。它用來指定離指定日的最近的一個平日。大部分的商業處理都是基於工作周的,所以 W 字符可能是非常重要的。例如,日域中的 15W 意味著 "離該月15號的最近一個平日。" 假如15號是星期六,那麽 trigger 會在14(星期四)觸發,因為距15號最近的是星期一,這個例子中也會是17號(譯者Unmi註:不會在17號觸發的,如果是15W,可能會是在14(15號是星期六)或者15(15號是星期天)觸發,也就是只能出現在鄰近的一天,如果15號當天為平日直接就會當日執行)。W 只能用在指定的日域為單天,不能是範圍或列表值。

# 井號

# 字符僅能用於周域中。它用於指定月份中的第幾周的哪一天。例如,如果你指定周域的值為 6#3,它意思是某月的第三個周五 (6=星期五,#3意味著月份中的第三周)。另一個例子 2#1 意思是某月的第一個星期一 (2=星期一,#1意味著月份中的第一周)。註意,假如你指定 #5,然而月份中沒有第 5 周,那麽該月不會觸發。

示例:

表達式意義

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

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

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

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

"0 15 10 * * ?2005" 2005年的每天上午10:15觸發

"0 * 14 * *?" 在每天下午2點到下午2:59期間的每1分鐘觸發

"0 0/5 14 * *?" 在每天下午2點到下午2:55期間的每5分鐘觸發

"0 0/5 14,18 ** ?" 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發

"0 0-5 14 * *?" 在每天下午2點到下午2:05期間的每1分鐘觸發

"0 10,44 14 ? 3WED" 每年三月的星期三的下午2:102:44觸發

"0 15 10 ? *MON-FRI" 周一至周五的上午10:15觸發

"0 15 10 15 *?" 每月15日上午10:15觸發

"0 15 10 L *?" 每月最後一日的上午10:15觸發

"0 15 10 ? *6L" 每月的最後一個星期五上午10:15觸發

"0 15 10 ? * 6L2002-2005" 2002年至2005年的每月的最後一個星期五上午10:15觸發

"0 15 10 ? *6#3" 每月的第三個星期五上午10:15觸發

Quartz學習記錄(一)