天天看點

任務排程架構Quartz學習筆記

   因為某篇大牛文章推薦了所謂十個  java程式員必備的15個架構,位址在:​​這裡​​。  抱着甯可信其有,不可信其無的态度,将其中幾個不是很熟悉的内容看一看,并做筆記記錄。需要在短時間學的怎麼怎麼樣是不太現實的, 是以簡單記錄記錄。 今天的目标是至少記錄三個相關的架構筆記。   第一個:Quartz;

   學習一個架構我覺得包括兩點:第一,知道它是幹什麼的; 第二,知道如何使用;  第三,知道大緻的原理。  有什麼用,如何使用可以在官方文檔上清楚的查到;  大緻原理最理想的方法就是調試。 是以下文将以這種思路展開。

1.Quartz是什麼:

任務排程架構Quartz學習筆記

     直覺一點的場景是: 它可以用于定時任務任務的場景中。

任務排程架構Quartz學習筆記

2.Quartz如何使用:

     導包什麼的那是必需的就不提了,主要看看它如何在項目中使用。

package com.automann;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

/**
 * @author [email protected]
 * @time 2018/11/25 10:53
 */
public class Main {

    public static void main(String[] args) throws SchedulerException {
        //從工廠中獲得排程執行個體
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        // 開始排程
        scheduler.start();

        // 定義任務并與我們指定的任務類綁定
        JobDetail job = newJob(TheJob.class)
                .withIdentity("job1", "group1")
                .build();

        // 觸發任務現在執行,并且每隔40秒執行一次
        Trigger trigger = newTrigger()
                .withIdentity("trigger1", "group1")
                .startNow()
                .withSchedule(simpleSchedule()
                        .withIntervalInSeconds(40)
                        .repeatForever())
                .build();

        //讓quartz用我們的觸發器去排程任務
        scheduler.scheduleJob(job, trigger);
    }
   public static class TheJob implements Job{
        public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            System.out.println("hello quartz!");
        }
    }
}      

執行結果:

任務排程架構Quartz學習筆記

    在實踐過程中,有幾點需要注意:

          1.任務類必須是public的,且必須包括無參構造;

          2.必須包含日志架構slf4j;  但是要注意,它隻是一個标準,而沒有具體的實作,是以,至少需要一個它的實作類。  日志架構的具體用法見:​​ java-web環境內建各種主流日志架構(jcl,jul,slf4j,log4j,logback)總結​​。

3.quartz的大緻原理:

     在上面實際使用中,涉及到這幾個概念:   任務,排程器,觸發器;  那麼看它的大緻原理的時候,便可以從這幾個方面入手。

      按照邏輯先後順序檢視:則應該是: 排程器>觸發器>任務

     排程器:

任務排程架構Quartz學習筆記

    它的執行個體預設由工廠環境提供,工廠環境執行個體的時候的一些代碼片段:

任務排程架構Quartz學習筆記

之後經過一個大概600行的方法,做了一些環境的初始化。  它最終的結果将會有以下的一些結果:

任務排程架構Quartz學習筆記
任務排程架構Quartz學習筆記
任務排程架構Quartz學習筆記

它的一個核心方法:start()。   看看它在某一個具體的排程器中是如何實作的:

任務排程架構Quartz學習筆記
任務排程架構Quartz學習筆記
任務排程架構Quartz學習筆記

     總之,它的核心應該是開啟了一個監聽。 根據監聽對象的狀态做出相應的操作。

任務排程架構Quartz學習筆記
任務排程架構Quartz學習筆記

  注意到,這個start()方法中并不蘊含類似于while()語句來用于阻塞線程的操作的功能。  它隻是單次執行的。  每次執行,就通知一遍注冊了的監聽器做相應操作。。

  觸發器:

任務排程架構Quartz學習筆記

   它的執行個體是通過工廠模式,以及 構造器模式。 通過構造器模式,可以很友善的設定一些參數。  它的所有的動作也隻是初始參數。  最終将構造出的執行個體交給排程器具體執行。   

    調用的是排程的scheduleJob(Job,Trigger)方法。  是以,有必要去看看它的實作代碼片段:

任務排程架構Quartz學習筆記

繼續閱讀