quartz框架(一)-入門使用


什么是quartz?

quartz是一個開源的任務調度框架,它可以幫助我們實現任務的定時調度,任務的持久化,支持故障切換和負載均衡。當然,它的優點遠遠不止這些。

什么是任務調度框架?

任務調度框架的核心功能就是它可以根據我們定義好的調度規則,在線程池中創建線程來執行我們的業務方法。那么一個完善的任務調度框架需要具備哪些功能呢?

靈活的觸發規則

觸發規則就是我的這個業務方法需要在什么時候開始執行,每隔多少時間執行,一共需要執行多少次。對於觸發規則來說我們常見的是使用corn表達式,來進行任務觸發規則的表達。

任務的持久化

任務的持久化就是彌補內存中保存任務的不足。比如說程序異常退出,那么此時我們就無法知道上一次執行的狀態,只能夠重新開始執行。舉個例子,比如說我們的某個任務需要在9點執行,當前時間為8.59分,程序剛好異常退出。重新啟動完成的時候已經到了9點01分,那么此時我們是無法知道9點是否執行了那個任務的。

彌補措施

上面說到了,如果程序異常退出,那么此時我們應該基於什么樣的策略進行彌補?是直接忽略,還是立馬執行?quartz的彌補策略比較豐富,博主會在之后的文章中詳細介紹。除了異常退出會導致失火之外,任務的耗時執行,也會導致失火。比如說你的任務每隔3秒執行依次,你的任務執行一次需要5秒,那么你的任務還沒執行完的時候,第二個觸發調度就開始了,那么此時又應該怎么處理呢?

負載均衡

為了解決單點故障的問題,我們可以多部署幾個服務。但是怎么確保這些服務可以平均分分配到對應的服務器上,這里就需要使用負載均衡策略,比如說隨機分配,加權輪詢等。

任務的監控

作為使用者來說,我們當然希望知道此時程序任務的執行狀態。而通過日志,數據庫表查詢狀態的方式並不直接,也比較費時費力,也不通用。那么此時,我們就需要提供一個監控界面,來實時查看任務的總體情況,以及某一個任務的執行歷史,當然我們也可以手動決定某個任務是否執行,這樣我們就不需要修改代碼重新發布了。

quartz使用

說了這么多關於任務調度框架的東西,我們先來介紹一下quartz的簡單使用。至於源碼,以及更詳細的quartz使用,博主會在后面的文章中繼續介紹。

導入依賴

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.0</version>
</dependency>

編寫job

我們先實現一個job,然后在execute方法里面,放入我們的業務邏輯。

public class TestJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("hello world!");
    }
}

調度job

有了任務之后,我們需要對任務進行調度。

public class Main {
    public static void main(String[] args) throws SchedulerException {

//創建一個任務詳情對象,它里面有我們業務job的class對象
        JobDetail jobDetail = JobBuilder.newJob(TestJob.class).withIdentity("myJob").build();

//創建一個簡單的觸發器,它的觸發規則是基於當前時間,每個1秒執行,並且只執行一次。
        SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).withRepeatCount(1)).build();

//創建調度器,它會根據觸發規則,將任務放到線程中執行。
        StdSchedulerFactory factory = new StdSchedulerFactory();
        Scheduler scheduler = factory.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail,trigger);
    }
}

查看運行結果

運行結果

博主微信公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM