Quartz入門(一) --初步

Quartz入門(一)

下載與安裝

下載jar包,將lib包放入classpath中

概述

Quartz對任務(wù)調(diào)度的領(lǐng)域問題進(jìn)行了高度的抽象,提出了調(diào)度器、任務(wù)觸發(fā)器這3個核心的概念,并在org.quartz通過接口和類對重要的這些核心概念進(jìn)行描述

  • 調(diào)度器:調(diào)度器用于將與作業(yè)觸發(fā)器關(guān)聯(lián),一個作業(yè)可關(guān)聯(lián)多個觸發(fā)器,這樣每個觸發(fā)器被可以觸發(fā)的作業(yè)執(zhí)行;一個觸發(fā)器可用于控制多個作業(yè),觸發(fā)觸發(fā)時,
    全部作業(yè)將獲得調(diào)度。Quartz的調(diào)度器由Scheduler接口體現(xiàn).
  • 作業(yè):只需實(shí)現(xiàn)org.quartz.job接口即可。Job接口包含一個方法execute(),execute()方法體是被調(diào)度的作業(yè)體。一旦實(shí)現(xiàn)Job接口和execute()方法,
    Quartz確定作業(yè)運(yùn)作的時候,它將調(diào)用execute()方法體。
  • 觸發(fā)器:有SimpleTrigger和CronTrigger兩種類型
quartz

一個簡單的例子

新建一個叫MyJob的類,實(shí)現(xiàn)Job接口

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.util.Calendar;

/**
 * Created by mi on 2017/5/2.
 */
public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("任務(wù)正在執(zhí)行,執(zhí)行時間: " + Calendar.getInstance().getTime());
    }
}

新建一個叫QuartzTest的類

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

import java.util.Date;

/**
 * Created by CiCi on 2017/5/2.
 */
public class QuartzTest {
    public static void main(String[] args) throws Throwable {
        SchedulerFactory factory = new StdSchedulerFactory();
        // 從工廠里面拿到一個scheduler實(shí)例
        Scheduler scheduler = factory.getScheduler();
        // 計算任務(wù)的開始時間,DateBuilder.evenMinuteDate方法是取下一個整數(shù)分鐘
        Date runTime = DateBuilder.evenMinuteDate(new Date());
        // 真正執(zhí)行的任務(wù)并不是Job接口的實(shí)例,而是用反射的方式實(shí)例化的一個JobDetail實(shí)例
        JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();
        // 定義一個觸發(fā)器,startAt方法定義了任務(wù)應(yīng)當(dāng)開始的時間
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();
        // 將任務(wù)和Trigger放入scheduler
        scheduler.scheduleJob(job, trigger);
        scheduler.start();
        try {
            // 等待65秒,保證下一個整數(shù)分鐘出現(xiàn),這里注意,如果主線程停止,任務(wù)是不會執(zhí)行的
            Thread.sleep(65L * 1000L);
        } catch (Exception e) {

        }
        // scheduler結(jié)束
        scheduler.shutdown(true);
    }
}

通過代碼可以看到幾個重要的類:

  • JobDetail:真正的任務(wù)內(nèi)容,任務(wù)本身是繼承Job接口的,但是真正的任務(wù)是JobBuilder通過反射的方式實(shí)例化的
    JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job","group1").build()

  • Trigger:觸發(fā)器,定義任務(wù)應(yīng)當(dāng)開始的時間,主要分為兩類SimpleTrigger,CronTrigger。當(dāng)前例子是簡單觸發(fā)器,CronTrigger主要用于處理quartz表達(dá)式定義的任務(wù),比如每個月20號,每個星期一之類的。
    // 定義一個觸發(fā)器,startAt方法定義了任務(wù)應(yīng)當(dāng)開始的時間 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();

  • Scheduler:調(diào)度器,現(xiàn)在我們有了要做的內(nèi)容,有了做任務(wù)的時間,接下來,就把這兩個內(nèi)容填充到計劃任務(wù)Scheduler對象里面,到了時間它就可以自動運(yùn)行啦。
    scheduler.scheduleJob(job, trigger); scheduler.start();

注意事項(xiàng)

  • Quartz一般是通過日志打印的方式來執(zhí)行任務(wù)的,所以一定要有日志配置。博主是將log4j.properties文件加入到classpath下。博主一開始認(rèn)為我自己沒有日志輸出就可以不配置,就一直報錯啊

  • 引入包的時候,只引入lib就可以了,多引了可能是存在重復(fù)或者版本不一的問題,增增減減鼓搗了好久也沒有搞出來,最后重新建了一個文件,只引入lib就可以啦。

參考文獻(xiàn)

官方文檔
Quartz的搭建,應(yīng)用
Quartz任務(wù)調(diào)度快速入門
Quartz2之入門實(shí)例
Quartz使用-入門使用(java定時任務(wù)實(shí)現(xiàn))
Quartz開源的作業(yè)調(diào)度框架

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容