1. 程式人生 > 實用技巧 >【Quartz】01 快速上手

【Quartz】01 快速上手

一、Quartz概述

Quartz是用來做定時任務排程的JavaEE框架

需求場景:

1、在每個月末,自動網易雲會員續費,或者百度雲盤會員續費

2、在迅雷下載完一個超過10G的資源的30秒之後自動關機

也就是說我們希望在某一個特定的時刻,去執行一些事情

二、快速入門

POM座標:

<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId
>quartz</artifactId> <version>2.3.2</version> </dependency>

開啟右側的Maven選單工具,可以看到Quartz的依賴項,包含了兩個資料來源

編寫一個類並且實現Job介面,重寫介面的execute方法

package cn.dzz.quartz;

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

/**
 * @author
Echo42 * @file Quartz * @create 2020年09月12日16:53 * @description */ public class HelloQuartz implements Job { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 我們希望執行的邏輯 System.out.println("Hello Quartz !!!"); } }

編寫可執行的方法【Main或者JunitTest】

package cn.dzz;

import cn.dzz.quartz.HelloQuartz;
import org.junit.Test;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.GregorianCalendar;

/**
 * @author Echo42
 * @file Quartz
 * @create 2020年09月12日16:56
 * @description
 */
public class QuartzTest {

    @Test
    public void testQuartzSample() throws SchedulerException {
        // 1、排程器物件
        Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler();
        
        // 2、觸發器物件 ,指定執行事件如何觸發
        SimpleTrigger simpleTrigger = TriggerBuilder.
                newTrigger(). // 建立新的觸發器
                withIdentity("trigger01", "group01"). // 觸發器例項的標識資訊
                startNow(). // 從什麼時候開始觸發執行
                withSchedule( // 如何排程執行的規則
                SimpleScheduleBuilder.
                        simpleSchedule().
                        withIntervalInSeconds(10).
                        repeatForever()
                ).
                endAt( // 從什麼時候結束執行
                        new GregorianCalendar(2020, 10, 2, 14, 26, 33).
                                getTime()
                ).
                build();

        // 3、職責詳細 JobDetail
        JobDetail jobDetail = JobBuilder.newJob(HelloQuartz.class).withIdentity("trigger01", "group01").build();
        
        // 4、把職責詳細物件和觸發器物件注入到排程器物件中
        defaultScheduler.scheduleJob(jobDetail, simpleTrigger);
        
        // 5、啟動排程器
        defaultScheduler.start();
    }
}

單元測試的結果,沒反應?直接結束了

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Process finished with exit code 0

換成main執行:

這才有效了。。。。

執行的上下文引數:

package cn.dzz.quartz;

import org.quartz.*;

/**
 * @author Echo42
 * @file Quartz
 * @create 2020年09月12日16:53
 * @description
 */
public class HelloQuartz implements Job {

    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        // 我們希望執行的邏輯
        System.out.println("Hello Quartz !!!");
        
        // 除此之外,還可以獲取呼叫此Job類的標識
        JobDetail jobDetail = jobExecutionContext.getJobDetail();
        JobKey jobDetailKey = jobDetail.getKey();
        String name = jobDetailKey.getName();   // trigger01
        String group = jobDetailKey.getGroup(); // group01
    }
}

Quartz的外部配置檔案:

# quartz.properties 不可以更改配置檔名稱,預設位置classpath目錄下面。
# 如果沒有此配置檔案,Quartz會按照預設配置執行

# 指定排程器名稱,非實現類?
org.quartz.scheduler.instanceName = DefaultQuartzScheduler

# 指定執行緒池實現類
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

# 執行緒池數量
org.quartz.threadPool.threadCount = 10

# 優先順序,預設5
org.quartz.threadPool.threadPriority = 5

# 非持久化job
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

核心類:

1、Scheduler  排程器,控制所有排程,Quartz的核心API,管理了所有任務

2、Job  任務,即我們希望Quartz管理的業務邏輯定義

3、JobDetail  任務詳細,對Job物件的進一步封裝,指定更詳細的屬性

4、Trigger  觸發器,繫結任務,規定任務執行的觸發規則

三、兩種觸發器:

SimpleTrigger & CronTrigger

1、SimpleTrigger 以一定時間範圍內執行的任務,指定起始時間和截止時間,指定時間間隔與次數

// 2、觸發器物件 ,指定執行事件如何觸發
SimpleTrigger simpleTrigger = TriggerBuilder.
        newTrigger(). // 建立新的觸發器
        withIdentity("trigger01", "group01"). // 觸發器例項的標識資訊
        startNow(). // 從什麼時候開始觸發執行
        withSchedule( // 如何排程執行的規則
        SimpleScheduleBuilder.
                simpleSchedule(). //
                withIntervalInSeconds(10).
                repeatForever()
).
endAt( // 從什麼時候結束執行
        new GregorianCalendar(2020, 10, 2, 14, 26, 33).
                getTime()
).
build();

2、用來規定更為複雜的觸發規則,支援Linux Cron的語法,

只需要Cron表示式即可

private static void cronExpressionQuartzDemo() {
    try {
        Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler();

        CronTrigger cronTrigger = TriggerBuilder.
                newTrigger().
                withIdentity("trigger02", "group02").
                withSchedule(
                // cron 表示式 秒 分 時 日 月 周 年
                // 年可以省略
                // 10月 22日 16時 34分 20秒
                // ? 問號表示不明確,但是我們上述的內容可以讓Quartz自行推算具體值
                CronScheduleBuilder.cronSchedule("20 34 16 22 10 ?")
                // CronScheduleBuilder.cronSchedule("20 34 16 22 10 ?") 在這個表示式規定這個時刻執行一次

                // 把任意的一個表示式計量值 換成 * 表示在這個時間單位上進行重複的執行
                // 例如   "* 34 16 22 10 ?" 表示每秒執行
                // 同理可以 每分鐘,每小時,每天,每個星期,每個月,或者最後到每年

                // 使用 */n 表示每時間單位計量值的N倍,再執行
                // 例如   "*/2 34 16 22 10 ?" 每兩秒執行一次
        ).build();

        JobDetail jobDetail = JobBuilder.newJob(HelloQuartz.class).withIdentity("trigger01", "group01").build();

        defaultScheduler.scheduleJob(jobDetail, null);

        defaultScheduler.start();
    } catch (Exception exception) {
        exception.printStackTrace();
    }
}

Cron表示式詳細參考:

https://www.cnblogs.com/yanghj010/p/10875151.html

Spring整合Quartz就沒再繼續寫了,配置麻煩

視訊參考:

https://www.bilibili.com/video/BV1zz4y1X71Z