日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Quartz教程二:API,Job和Trigger

發(fā)布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Quartz教程二:API,Job和Trigger 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文鏈接?|?譯文鏈接?| 翻譯:nkcoder?| 校對:方騰飛

本系列教程由quartz-2.2.x官方文檔翻譯、整理而來,希望給同樣對quartz感興趣的朋友一些參考和幫助,有任何不當(dāng)或錯誤之處,歡迎指正;有興趣研究源碼的同學(xué),可以參考我對quartz-core源碼的注釋(進(jìn)行中)。

Quartz API

Quartz API核心接口有:

  • Scheduler – 與scheduler交互的主要API;
  • Job – 你通過scheduler執(zhí)行任務(wù),你的任務(wù)類需要實現(xiàn)的接口;
  • JobDetail – 定義Job的實例;
  • Trigger – 觸發(fā)Job的執(zhí)行;
  • JobBuilder – 定義和創(chuàng)建JobDetail實例的接口;
  • TriggerBuilder – 定義和創(chuàng)建Trigger實例的接口;

Scheduler的生命期,從SchedulerFactory創(chuàng)建它時開始,到Scheduler調(diào)用shutdown()方法時結(jié)束;Scheduler被創(chuàng)建后,可以增加、刪除和列舉Job和Trigger,以及執(zhí)行其它與調(diào)度相關(guān)的操作(如暫停Trigger)。但是,Scheduler只有在調(diào)用start()方法后,才會真正地觸發(fā)trigger(即執(zhí)行job),見教程一。

Quartz提供的“builder”類,可以認(rèn)為是一種領(lǐng)域特定語言(DSL,Domain Specific Language)。教程一中有相關(guān)示例,這里是其中的代碼片段:(校對注:這種級聯(lián)的API非常方便用戶使用,大家以后寫對外接口時也可以使用這種方式)


// define the job and tie it to our HelloJob classJobDetail job = newJob(HelloJob.class).withIdentity("myJob", "group1") // name "myJob", group "group1".build();// Trigger the job to run now, and then every 40 secondsTrigger trigger = newTrigger().withIdentity("myTrigger", "group1").startNow().withSchedule(simpleSchedule().withIntervalInSeconds(40).repeatForever()) .build();// Tell quartz to schedule the job using our triggersched.scheduleJob(job, trigger);

定義job的代碼使用的是從JobBuilder靜態(tài)導(dǎo)入的方法。同樣,定義trigger的代碼使用的是從TriggerBuilder靜態(tài)導(dǎo)入的方法 。 另外,也導(dǎo)入了SimpleSchedulerBuilder類的靜態(tài)方法;

從DSL里靜態(tài)導(dǎo)入的語句如下:


import static org.quartz.JobBuilder.*;import static org.quartz.SimpleScheduleBuilder.*;import static org.quartz.CronScheduleBuilder.*;import static org.quartz.CalendarIntervalScheduleBuilder.*;import static org.quartz.TriggerBuilder.*;import static org.quartz.DateBuilder.*;

SchedulerBuilder接口的各種實現(xiàn)類,可以定義不同類型的調(diào)度計劃(schedule);

DateBuilder類包含很多方法,可以很方便地構(gòu)造表示不同時間點的java.util.Date實例(如定義下一個小時為偶數(shù)的時間點,如果當(dāng)前時間為9:43:27,則定義的時間為10:00:00)。

Job和Trigger

一個job就是一個實現(xiàn)了Job接口的類,該接口只有一個方法:

Job接口:


package org.quartz;public interface Job {public void execute(JobExecutionContext context)throws JobExecutionException;}

當(dāng)job的一個trigger被觸發(fā)后(稍后會講到),execute()方法會被scheduler的一個工作線程調(diào)用;傳遞給execute()方法的JobExecutionContext對象中保存著該job運行時的一些信息 ,執(zhí)行job的scheduler的引用,觸發(fā)job的trigger的引用,JobDetail對象引用,以及一些其它信息。

JobDetail對象是在將job加入scheduler時,由客戶端程序(你的程序)創(chuàng)建的。它包含job的各種屬性設(shè)置,以及用于存儲job實例狀態(tài)信息的JobDataMap。本節(jié)是對job實例的簡單介紹,更多的細(xì)節(jié)將在下一節(jié)講到。

Trigger用于觸發(fā)Job的執(zhí)行。當(dāng)你準(zhǔn)備調(diào)度一個job時,你創(chuàng)建一個Trigger的實例,然后設(shè)置調(diào)度相關(guān)的屬性。Trigger也有一個相關(guān)聯(lián)的JobDataMap,用于給Job傳遞一些觸發(fā)相關(guān)的參數(shù)。Quartz自帶了各種不同類型的Trigger,最常用的主要是SimpleTrigger和CronTrigger。

SimpleTrigger主要用于一次性執(zhí)行的Job(只在某個特定的時間點執(zhí)行一次),或者Job在特定的時間點執(zhí)行,重復(fù)執(zhí)行N次,每次執(zhí)行間隔T個時間單位。CronTrigger在基于日歷的調(diào)度上非常有用,如“每個星期五的正午”,或者“每月的第十天的上午10:15”等。

為什么既有Job,又有Trigger呢?很多任務(wù)調(diào)度器并不區(qū)分Job和Trigger。有些調(diào)度器只是簡單地通過一個執(zhí)行時間和一些job標(biāo)識符來定義一個Job;其它的一些調(diào)度器將Quartz的Job和Trigger對象合二為一。在開發(fā)Quartz的時候,我們認(rèn)為將調(diào)度和要調(diào)度的任務(wù)分離是合理的。在我們看來,這可以帶來很多好處。

例如,Job被創(chuàng)建后,可以保存在Scheduler中,與Trigger是獨立的,同一個Job可以有多個Trigger;這種松耦合的另一個好處是,當(dāng)與Scheduler中的Job關(guān)聯(lián)的trigger都過期時,可以配置Job稍后被重新調(diào)度,而不用重新定義Job;還有,可以修改或者替換Trigger,而不用重新定義與之關(guān)聯(lián)的Job。

Key

將Job和Trigger注冊到Scheduler時,可以為它們設(shè)置key,配置其身份屬性。Job和Trigger的key(JobKey和TriggerKey)可以用于將Job和Trigger放到不同的分組(group)里,然后基于分組進(jìn)行操作。同一個分組下的Job或Trigger的名稱必須唯一,即一個Job或Trigger的key由名稱(name)和分組(group)組成。

對于Job和Trigger,你現(xiàn)在有一個大概的了解了,更詳細(xì)的介紹參見教程三和教程四。

總結(jié)

以上是生活随笔為你收集整理的Quartz教程二:API,Job和Trigger的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。