1. 程式人生 > >定時任務框架Quartz-(一)Quartz入門與Demo搭建

定時任務框架Quartz-(一)Quartz入門與Demo搭建

一、什麼是Quartz

什麼是Quartz?

Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源專案,完全由Java開發,可以用來執行定時任務,類似於java.util.Timer。但是相較於Timer, Quartz增加了很多功能:

  • 永續性作業 - 就是保持排程定時的狀態;
  • 作業管理 - 對排程作業進行有效的管理;

大部分公司都會用到定時任務這個功能。
拿火車票購票來說,當你下單後,後臺就會插入一條待支付的task(job),一般是30分鐘,超過30min後就會執行這個job,去判斷你是否支付,未支付就會取消此次訂單;當你支付完成之後,後臺拿到支付回撥後就會再插入一條待消費的task(job),Job觸發日期為火車票上的出發日期,超過這個時間就會執行這個job,判斷是否使用等。

在我們實際的專案中,當Job過多的時候,肯定不能人工去操作,這時候就需要一個任務排程框架,幫我們自動去執行這些程式。那麼該如何實現這個功能呢?

(1)首先我們需要定義實現一個定時功能的介面,我們可以稱之為Task(或Job),如定時傳送郵件的task(Job),重啟機器的task(Job),優惠券到期傳送簡訊提醒的task(Job),實現介面如下:
這裡寫圖片描述

(2)有了任務之後,還需要一個能夠實現觸發任務去執行的觸發器,觸發器Trigger最基本的功能是指定Job的執行時間,執行間隔,執行次數等。
這裡寫圖片描述

(3)有了Job和Trigger後,怎麼樣將兩者結合起來呢?即怎樣指定Trigger去執行指定的Job呢?這時需要一個Schedule,來負責這個功能的實現。
這裡寫圖片描述

上面三個部分就是Quartz的基本組成部分:

  • 排程器:Scheduler
  • 任務:JobDetail
  • 觸發器:Trigger,包括SimpleTrigger和CronTrigger

二、Quartz Demo搭建

下面來利用Quartz搭建一個最基本的Demo。
1、匯入依賴的jar包:

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

2、新建一個能夠列印任意內容的Job:

/**
 * Created by wanggenshen
 * Date: on 2018/7/7 16:28.
 * Description: 列印任意內容
 */
public class PrintWordsJob implements Job{

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        String printTime = new SimpleDateFormat("yy-MM-dd HH-mm-ss").format(new Date());
        System.out.println("PrintWordsJob start at:" + printTime + ", prints: Hello Job-" + new Random().nextInt(100));

    }
}

3、建立Schedule,執行任務:

/**
 * Created by wanggenshen
 * Date: on 2018/7/7 16:31.
 * Description: XXX
 */
public class MyScheduler {

    public static void main(String[] args) throws SchedulerException, InterruptedException {
        // 1、建立排程器Scheduler
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        // 2、建立JobDetail例項,並與PrintWordsJob類繫結(Job執行內容)
        JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class)
                                        .withIdentity("job1", "group1").build();
        // 3、構建Trigger例項,每隔1s執行一次
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
                .startNow()//立即生效
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(1)//每隔1s執行一次
                .repeatForever()).build();//一直執行

        //4、執行
        scheduler.scheduleJob(jobDetail, trigger);
        System.out.println("--------scheduler start ! ------------");
        scheduler.start();

        //睡眠
        TimeUnit.MINUTES.sleep(1);
        scheduler.shutdown();
        System.out.println("--------scheduler shutdown ! ------------");


    }
}

執行程式,可以看到程式每隔1s會打印出內容,且在一分鐘後結束:
這裡寫圖片描述

三、Quartz核心詳解

下面就程式中出現的幾個引數,看一下Quartz框架中的幾個重要引數:

  • Job和JobDetail
  • JobExecutionContext
  • JobDataMap
  • Trigger、SimpleTrigger、CronTrigger

(1)Job和JobDetail
Job是Quartz中的一個介面,介面下只有execute方法,在這個方法中編寫業務邏輯。
介面中的原始碼:
這裡寫圖片描述

JobDetail用來繫結Job,為Job例項提供許多屬性:

  • name
  • group
  • jobClass
  • jobDataMap

JobDetail繫結指定的Job,每次Scheduler排程執行一個Job的時候,首先會拿到對應的Job,然後建立該Job例項,再去執行Job中的execute()的內容,任務執行結束後,關聯的Job物件例項會被釋放,且會被JVM GC清除。

為什麼設計成JobDetail + Job,不直接使用Job

JobDetail定義的是任務資料,而真正的執行邏輯是在Job中。
這是因為任務是有可能併發執行,如果Scheduler直接使用Job,就會存在對同一個Job例項併發訪問的問題。而JobDetail & Job 方式,Sheduler每次執行,都會根據JobDetail建立一個新的Job例項,這樣就可以規避併發訪問的問題。

(2)JobExecutionContext
JobExecutionContext中包含了Quartz執行時的環境以及Job本身的詳細資料資訊。
當Schedule排程執行一個Job的時候,就會將JobExecutionContext傳遞給該Job的execute()中,Job就可以通過JobExecutionContext物件獲取資訊。
主要資訊有:
這裡寫圖片描述

(3)JobExecutionContext
JobDataMap實現了JDK的Map介面,可以以Key-Value的形式儲存資料。
JobDetail、Trigger都可以使用JobDataMap來設定一些引數或資訊,
Job執行execute()方法的時候,JobExecutionContext可以獲取到JobExecutionContext中的資訊:
如:

JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class)                        .usingJobData("jobDetail1", "這個Job用來測試的")
                  .withIdentity("job1", "group1").build();

 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
      .usingJobData("trigger1", "這是jobDetail1的trigger")
      .startNow()//立即生效
      .withSchedule(SimpleScheduleBuilder.simpleSchedule()
      .withIntervalInSeconds(1)//每隔1s執行一次
      .repeatForever()).build();//一直執行

Job執行的時候,可以獲取到這些引數資訊:

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

        System.out.println(jobExecutionContext.getJobDetail().getJobDataMap().get("jobDetail1"));
        System.out.println(jobExecutionContext.getTrigger().getJobDataMap().get("trigger1"));
        String printTime = new SimpleDateFormat("yy-MM-dd HH-mm-ss").format(new Date());
        System.out.println("PrintWordsJob start at:" + printTime + ", prints: Hello Job-" + new Random().nextInt(100));


    }

(4)Trigger、SimpleTrigger、CronTrigger

  • Trigger

Trigger是Quartz的觸發器,會去通知Scheduler何時去執行對應Job。

new Trigger().startAt():表示觸發器首次被觸發的時間;
new Trigger().endAt():表示觸發器結束觸發的時間;
  • SimpleTrigger
    SimpleTrigger可以實現在一個指定時間段內執行一次作業任務或一個時間段內多次執行作業任務。
    下面的程式就實現了程式執行5s後開始執行Job,執行Job 5s後結束執行:
Date startDate = new Date();
startDate.setTime(startDate.getTime() + 5000);

 Date endDate = new Date();
 endDate.setTime(startDate.getTime() + 5000);

        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
                .usingJobData("trigger1", "這是jobDetail1的trigger")
                .startNow()//立即生效
                .startAt(startDate)
                .endAt(endDate)
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(1)//每隔1s執行一次
                .repeatForever()).build();//一直執行
  • CronTrigger

CronTrigger功能非常強大,是基於日曆的作業排程,而SimpleTrigger是精準指定間隔,所以相比SimpleTrigger,CroTrigger更加常用。CroTrigger是基於Cron表示式的,先了解下Cron表示式:
由7個子表示式組成字串的,格式如下:

[秒] [分] [小時] [日] [月] [周] [年]

Cron表示式的語法比較複雜,
如:* 30 10 ? * 1/5 *
表示(從後往前看)
[指定年份] 的[ 週一到週五][指定月][不指定日][上午10時][30分][指定秒]

又如:00 00 00 ? * 10,11,12 1#5 2018
表示2018年10、11、12月的第一週的星期五這一天的0時0分0秒去執行任務。

下面是給的一個例子:
這裡寫圖片描述

下面的程式碼就實現了每週一到週五上午10:30執行定時任務

/**
 * Created by wanggenshen
 * Date: on 2018/7/7 20:06.
 * Description: XXX
 */
public class MyScheduler2 {
    public static void main(String[] args) throws SchedulerException, InterruptedException {
        // 1、建立排程器Scheduler
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        // 2、建立JobDetail例項,並與PrintWordsJob類繫結(Job執行內容)
        JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class)
                .usingJobData("jobDetail1", "這個Job用來測試的")
                .withIdentity("job1", "group1").build();
        // 3、構建Trigger例項,每隔1s執行一次
        Date startDate = new Date();
        startDate.setTime(startDate.getTime() + 5000);

        Date endDate = new Date();
        endDate.setTime(startDate.getTime() + 5000);

        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
                .usingJobData("trigger1", "這是jobDetail1的trigger")
                .startNow()//立即生效
                .startAt(startDate)
                .endAt(endDate)
                .withSchedule(CronScheduleBuilder.cronSchedule("* 30 10 ? * 1/5 2018"))
                .build();

        //4、執行
        scheduler.scheduleJob(jobDetail, cronTrigger);
        System.out.println("--------scheduler start ! ------------");
        scheduler.start();
        System.out.println("--------scheduler shutdown ! ------------");

    }
}

2018/07/07 20:10 in SH.

相關推薦

定時任務框架Quartz-()Quartz入門Demo搭建

一、什麼是Quartz 什麼是Quartz? Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源專案,完全由Java開發,可以用來執行定時任務,類似於java.util.Timer。但是相較於Timer, Qua

java後端定時任務框架(org.quartz

//從排程程式工廠獲取一個排程程式的例項 Scheduler scheduler = null; try { scheduler = StdSchedulerFactory.getDefaultScheduler();

atititt java定時任務框架選型Spring Quartz 註解總結

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Quartz定時任務框架() 入門案例

介紹 Quartz是一套支援時間排程的框架,官網http://www.quartz-scheduler.org/, jar 包下載,點這裡 入門案例 1. quartz.properties檔案 這個檔案不是必須建立的,如果需要建立使用,必須建立在ca

quartz入門及通用型自定義定時任務框架

package com.quartz.test; import java.text.ParseException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.apac

基於spring+quartz的分布式定時任務框架

path simple ngs 分布 方式 fix set 分布式 .cn http://www.cnblogs.com/aaronfeng/p/5537177.html 問題背景   我公司是一個快速發展的創業公司,目前有200人,主要業務是旅遊和酒店相關的,應用叠

Quartz.NET開源作業調度框架系列():快速入門step by step-轉

rand 隨機 axis 開發人員 c# returns .net開源 觸發 mis  Quartz.NET是一個被廣泛使用的開源作業調度框架 , 由於是用C#語言創建,可方便的用於winform和asp.net應用程序中。Quartz.NET提供了巨大的靈活性但又兼具

定時任務框架-quartz 時間配置

特殊情況 art 數據 需要 日期 場景 母親 strong 每天 quartz定時任務時間設置: 這些星號由左到右按順序代表 : * * * * * * * 格

Quartz定時任務框架(二) Quartz詳解

目錄 Quartz API Scheduler排程程式、SchedulerFactory排程程式工廠 scheduler排程程式 SchedulerFactory Job & JobDetail JobDataMap Job例項化的過程 job的註解宣告和併發

Quartz定時任務框架(三)SimpleTrigger和CronTrigger、最詳細的Cron表示式範例

Quartz的主要介面類是Schedule、Job、Trigger,而觸發器Trigger就是定時任務的觸發時間,它規定安排了關聯的任務會在什麼時候執行,並且表明了再次執行的時機。 目錄 Trigger StartTime & EndTime 優先順序(Priority)

c# quartz定時任務框架的使用

一、新建windows服務專案,並從nuget引用下圖示記的類庫: 二、滑鼠右鍵單擊Service1.cs,點選檢視程式碼,把類檔案修改成如下: Service1.cs public partial class Service1 : ServiceBase {

Quartz任務排程框架(啟動定時任務框架

Quartz任務排程框架(啟動定時任務框架) Quartz是OpenSymphony開源組織在Jobscheduling領域又一個開源專案,它可以與J2EE與J2SE應用程式相結合也可以單獨使用。Quartz可以用來建立簡單或為執行十個,百個,甚至是好幾萬個Jobs這樣複雜的

SpringBoot整合Quartz定時任務框架

1、quartz排程核心元素: Scheduler:任務排程器,是實際執行任務排程的控制器。在spring中通過SchedulerFactoryBean封裝起來。 Trigger:描述觸發Job執行的時間觸發規則。主要有SimpleTrigger和CronT

使用spring+quartz+react+antd搭建一個定時任務框架

使用springboot搭建後端服務 springboot相對於傳統的spring來講可以大大加快web專案的開發,配置檔案的減少也能讓整個專案簡潔明瞭 1.功能清單 包括以下幾項功能: 執行定時任務 ,可以在專案啟動時指定一系列任務 管理任務 ,提供增刪改

springboot整合定時任務(相對於Quartz和Task等框架非常簡單)

最近真正用springboot整合定時任務發現其流程灰常簡單,進一步突出了springboot的強大之處。相對於之前用過的quartz和task來說可以說是簡單爆了,尤其是quartz整合spirng的時候那配置簡直是日了動物園了。廢話不說直接懟程式碼。 package c

定時操作,公司裡叫定時任務排程,我用Quartz

由於剛開始寫部落格,很多使用技巧都不熟悉,所以歡迎大家多多指正,我將會不斷的完善寫過的文章,包括程式碼的優化和圖片的重新選擇。 最近在公司被讓做一個,定時自動檢測多臺遠端伺服器資料庫的功能,今天我把我找到的解決方式記錄在這裡,由於一次無法寫完,我先把定時任務實現

Quartz學習總結(2)——定時任務框架Quartz詳解

實現每隔1秒列印一個Hello World1.建立Maven專案,新增依賴:<dependency>      <groupId>org.quartz-scheduler</groupId>      <artifactId>quartz</artifac

spring boot + quartz定時任務框架入坑指南

quartz Quartz是一個功能豐富的開源作業排程庫,可以整合到幾乎任何Java應用程式中 新增Maven依賴 <!-- druid阿里巴巴資料庫連線池 --> <dependency&

quartz java實現的定時任務框架

概述瞭解Quartz體系結構Quartz對任務排程的領域問題進行了高度的抽象,提出了排程器、任務和觸發器這3個核心的概念,並在org.quartz通過介面和類對重要的這些核心概念進行描述:●Job:是一個介面,只有一個方法void execute(JobExecution

基於spring+quartz的分散式定時任務框架

問題背景    我公司是一個快速發展的創業公司,目前有200人,主要業務是旅遊和酒店相關的,應用迭代更新週期比較快,因此,開發人員花費了更多的時間去更=跟上迭代的步伐,而缺乏了對整個系統的把控 沒有叢集之前,公司定時任務的實現方式    在初期應用的訪問量並