1. 程式人生 > >Quartz學習總結(2)——定時任務框架Quartz詳解

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

實現每隔1秒列印一個Hello World
1.建立Maven專案,新增依賴:
<dependency>  
    <groupId>org.quartz-scheduler</groupId>  
    <artifactId>quartz</artifactId>  
    <version>2.3.0</version>  
</dependency>  
2.建立HelloWorldJob類
package quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;


public class HelloWorldJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        String strTime = new SimpleDateFormat("HH-mm-ss").format(new Date());

        System.out.println( strTime + ":Hello World!");
    }
}
3.建立MyScheduler類

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


public class MyScheduler {
    public static void main(String[] args) throws SchedulerException {
        //建立排程器Schedule
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();

        Scheduler scheduler = schedulerFactory.getScheduler();
        //建立JobDetail例項,並與HelloWordlJob類繫結
        JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
                .build();
        //建立觸發器Trigger例項(立即執行,每隔1S執行一次)
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "triggerGroup1")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
                .build();
        //開始執行
        scheduler.scheduleJob(jobDetail, trigger);
        scheduler.start();
    }
}
Quartz中幾個重要的物件
1.Job和JobDetail
Job是Quartz中的一個介面,介面下只有execute方法,在這個方法中編寫業務邏輯。
該介面的原始碼:
package org.quartz;  
public interface Job {  
    void execute(JobExecutionContext var1) throws JobExecutionException;  
}  
每次排程執行Job時,呼叫execute方法前會建立一個新的Job例項,執行完後,關聯的Job物件例項會被釋放,隨後jvm執行GC。


JobDetail是用來繫結Job,為Job例項提供了許多屬性,以及JobDataMap成員變數屬性。排程器scheduler通過JobDetail物件來新增Job例項。


屬性:
name
group
jobClass
jobDataMap
2.JobExecutionContext
當排程器Scheduler呼叫一個Job時,就會將JobExecutionContext傳遞給Job的execute()方法,Job能通過JobExecutionContext物件訪問到Quartz執行時的環境以及Job本身的詳細資料資訊。
程式碼演示:
public class HelloWorldJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        String strTime = new SimpleDateFormat("HH-mm-ss").format(new Date());
        System.out.println( strTime + ":Hello World!");
        System.out.println("JobDetail'name:" + jobExecutionContext.getJobDetail().getKey().getName());
        System.out.println("JobDetail'group:" + jobExecutionContext.getJobDetail().getKey().getGroup());
        System.out.println("JobDetail'class:" + jobExecutionContext.getJobDetail().getClass());
    }
}
3.JobDataMap
任務排程時可以通過JobExecutionContext獲取JobDataMap,可以裝在任何可序列化的資料物件,JobDataMap實現了JDK的Map介面,可以以Key-Value的形式儲存資料。
實戰:JobDetail和Trigger傳遞資料,HelloWorldJob類execute三種方式獲取資料。
//建立JobDetail例項,並與HelloWordlJob類繫結
JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
        .usingJobData("key1","this is jobDetail")
        .build();
//建立觸發器Trigger例項(立即執行,每隔1S執行一次)
Trigger trigger = TriggerBuilder.newTrigger()
        .withIdentity("trigger1", "triggerGroup1")
        .usingJobData("key2", "this is trigger")
        .startNow()
        .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
        .build();
HelloWorldJob獲取資料:
public class HelloWorldJob implements Job {
    private String key1;
    private String key2;
    public String getKey1() {
        return key1;
    }
    public void setKey1(String key1) {
        this.key1 = key1;
    }
    public String getKey2() {
        return key2;
    }
    public void setKey2(String key2) {
        this.key2 = key2;
    }
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        String strTime = new SimpleDateFormat("HH-mm-ss").format(new Date());
        System.out.println( strTime + ":Hello World!");
        //獲取DataMap資料方法一
        System.out.println("JobDetail JobDataMap:" + jobExecutionContext.getJobDetail().getJobDataMap().get("key1"));
        System.out.println("Trigger JobDataMap:" + jobExecutionContext.getTrigger().getJobDataMap().get("key2"));
        //獲取DataMap資料方法二
        System.out.println("JobDataMap:" + jobExecutionContext.getMergedJobDataMap().get("key1"));
        System.out.println("JobDataMap:" + jobExecutionContext.getMergedJobDataMap().get("key2"));
        //獲取資料方法三
        System.out.println("通過成員變數獲取" + key1);
        System.out.println("通過成員變數獲取" + key2);
    }
}
4.Trigger
Trigger是Quartz中的觸發器,任務執行時會通知排程器Scheduler何時觸發,幾個重要的屬性。
Jobkey:表示job例項的標識
StartTime:表示觸發器首次被觸發的時間(Java.util.Date)。
EndTime:表示觸發器結束觸發的時間(Java.util.Date)
實戰:實現5S後執行,10S後結束,期間每隔1S執行一次定時任務
程式碼演示:
MyScheduler類
public class MyScheduler {
    public static void main(String[] args) throws SchedulerException {
        //建立排程器Schedule
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        //建立JobDetail例項,並與HelloWordlJob類繫結
        JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
                .build();
        //建立觸發器Trigger例項(5S後執行,10S後結束)
            //開始時間(5S後)
        Date date1 = new Date();
        date1.setTime(date1.getTime() + 5000);
            //結束時間(10S後)
        Date date2 = new Date();
        date2.setTime(date2.getTime() + 10000);
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "triggerGroup1")
                .startAt(date1)
                .endAt(date2)
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
                .build();
        //開始執行
        scheduler.scheduleJob(jobDetail, trigger);
        scheduler.start();
    }
}
5.SimpleTrigger
SimpleTrigger可以實現在一個指定時間段內執行一次作業任務或一個時間段內多次執行作業任務。
實戰:5S後開始執行,間隔時間為1S,第一次執行後連續執行3次
package quartz2;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.util.Date;
public class MyScheduler2 {
    public static void main(String[] args) throws SchedulerException {
        //建立排程器Schedule
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        //建立JobDetail例項,並與HelloWordlJob類繫結
        JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
                .build();
        //建立觸發器Trigger例項(5S後執行,一直執行)
        //開始時間(5S後)
        Date date1 = new Date();
        date1.setTime(date1.getTime() + 5000);
        SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "triggerGroup1")
                .startAt(date1)
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
                            .withRepeatCount(3))
                .build();
        //開始執行
        scheduler.scheduleJob(jobDetail, trigger);
        scheduler.start();
    }
}
6.CronTrigger
CronTrigger功能非常強大,是基於日曆的作業排程,而SimpleTrigger是精準指定間隔,所以相比SimpleTrigger,CroTrigger更加常用。CroTrigger是基於Cron表示式的,先了解下Cron表示式:
由7個子表示式組成字串的,格式如下:
[秒] [分] [小時] [日] [月] [周] [年]
Cron表示式的語法就不多說了,因為我也記不住只能度娘,給大家提供個線上生成Cron表示式的工具:http://cron.qqe2.com/ ,方便實用。
實戰:實現每週一到週五上午10:30執行定時任務
package quartz2;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.util.Date;
public class MyScheduler3 {
    public static void main(String[] args) throws SchedulerException {
        //建立排程器Schedule
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        //建立JobDetail例項,並與HelloWordlJob類繫結
        JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
                .build();
        //建立觸發器CronTrigger例項(每週一到週五10:30執行任務)
        CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "triggerGroup1")
                .startNow()
                .withSchedule(CronScheduleBuilder.cronSchedule("* 30 10 ? * 1/5 *"))
                .build();
        //開始執行
        scheduler.scheduleJob(jobDetail, trigger);
        scheduler.start();
    }
}

相關推薦

Quartz學習總結2——定時任務框架Quartz

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

Celery 學習筆記2- 定時任務

定時任務 Celery 中啟動定時任務有兩種方式,(1)在配置檔案中指定;(2)在程式中指定。 # cele.py import celery app = celery.Celery('cele', broker='redis://localhost:6

RabbitMQ學習總結5——釋出和訂閱例項

一、Publish/Subscribe(釋出/訂閱)(using the Java Client) 在前面的教程中,我們建立了一個work Queue(工作佇列)。工作佇列背後的假設是每個任務是交付

Spring MVC 學習總結——控制器定義與@RequestMapping

一、控制器定義 控制器提供訪問應用程式的行為,通常通過服務介面定義或註解定義兩種方法實現。 控制器解析使用者的請求並將其轉換為一個模型。在Spring MVC中一個控制器可以包含多個Action(動作、方法)。 1.1、實現介面Controller定義控制器 Controller是一個介面,處在包org

Spring學習總結2- AOP

服務 win align schema 可重用性 ext 4.0 art 屬性表 一,什麽是AOP AOP(Aspect Oriented Programming)意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,

【數據結構】ArrayList原理及實現學習總結2

!= 需要 但是 object count def 原理 arrays 位置 ArrayList是一個基於數組實現的鏈表(List),這一點可以從源碼中看出: transient Object[] elementData; // non-private to si

OpenCV學習總結2- 視覺系統的構成要素

mic clas 學習 family 描述 計算機 opencv ati enc 相機將光源中的場景轉換成圖像,計算機視覺系統對圖像進行描述。 照明設備:光源成像設備:相機處理設備:主機算法軟件:視覺處理系統OpenCV學習總結(2)- 視覺系統的構成要素

Spring-batch學習總結2—Job,Flow創建及應用,多線程並發,決策器,監聽器,參數

class getname current ces 表達式 .get been ant string 一.Job的創建及其應用1.Job flow的介紹:(1)狀態機:例完成step1,是否繼續完成step2,step3,我們就需要通過Job flow來控制(2)進行演示:

事務學習總結2——spring事務

一、spring事務:       spring針對事務的解決方案,在基礎的隔離性基礎上,又增加了事務傳播行為、只讀事務、事務超時的機制。 二、事務傳播:       其實就是兩個事務傳播。     &n

《實戰Java高併發程式設計》學習總結2

第3章  JDK併發包 1 synchronized的功能擴充套件:重入鎖。使用java.util.concurrent.locks.ReentrantLock類來實現。 import java.util.concurrent.locks.ReentrantLock; publi

設計模式學習總結2單例模式、建造者模式、原型模式

單例模式(Singleton Pattern) 這種模式涉及到一個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。 單例模式有以下三點注意: 1、單例類只能有一個例項。 2、單

Python--列表list、元組(tuple)、字典dict 學習總結2

目錄 建立空元組 (2)、元組---tuple 1、元組的定義 tuple (元組) 與列表相似,不同之處是元組的  元素不能修改  元組   表示多個元素組成的序列 元組  在Python開發中有特定的應用場景 用於儲存  一串 資

springboot學習筆記---定時任務

Springboot Schedule (定時任務) 需求背景: 專案需要在(2018-12-01 12:00:00 -2018-12-01 17:00:00)期間每一小時從引擎中拉取一次資料,且程式每隔五秒執行一次 技術背景: 在開始做需求前百度了一下,網上很多都是使用Quartz

MySQL學習總結2-MySQL客戶端相關語句

1.啟動MySQL服務 在命令列輸入net start 服務名 2.停止MySQL服務 在命令列輸入net stop 服務名 也可以在“工作管理員”中啟動與停止MySQL服務 3.登入MySQL 在命令列輸入mysql -uroot

Maven學習總結2-Maven的安裝與配置、eclipse整合Maven

Maven的安裝與配置 一、下載 官網地址:http://maven.apache.org/download.cgi  二、安裝 將下載好的壓縮包解壓到D盤 三、配置 1.環境變數配置 (1)在“環境變數-系統變數”中新增一行:變數名為MAVEN

DQN從入門到放棄學習總結2

1、動作價值函式: 每個狀態對應多種動作,我們考率在某個狀態下執行不同動作所獲得的價值,通過其大小,便可選擇價值最大的來執行。Action-Value function:。同樣,也是用reward來表示,但是此處reward是執行動作以後獲得的,之前state對應的reward則是多種動作對應

敏捷開發系列學習總結2——Bug修改流程

原則,力求各司其職,簡單明瞭。 1. 測試人員提交bug ⑴ 標題: [ 模組名稱 ] 問題描述 ⑵ 內容: 問題重現步驟的描述,最好貼上圖片。 因為一圖勝萬言。 ⑶ 指定責任人: 根據bug指定責任人。如果不能確定責任人,就指定給專案負責人。 2. 責任人檢

Oracle學習總結2——Oracle資料庫設計總結三大正規化

一、實體與表對應關係 表<=>實體,欄位<=>屬性。 二、表與表的關係(實體間的關係):一對一、一對多、多對多 一對一:一條記錄只對應其他表中的一條記錄有關係 學生基本資訊表t_student,成績表t_studentScore含有一個外來

Tomcat學習總結2——Tomcat部署Java War包應用教程

一、打包JavaWeb應用  在Java中,使用"jar"命令來對將JavaWeb應用打包成一個War包,jar命令的用法如下:範例:將JavaWebDemoProject這個JavaWeb應用打包成w

Spring Boot學習總結2——Spring Boot整合Jsp

怎麼使用jsp上面起了疑問,查閱了多方資料,找到過其他人的部落格的描述,也找到了spring在github上的給出的例子,看完後稍微改動後成功 整合jsp,於是決定將整合過程記載下來。 無論使用