初探SpringBoot整合Quartz定時任務

2022-01-09 轉轉QA

作者|伊星宇

動態定時任務,就是在不重啟服務的狀態下,可以做到繼續添加,更新已有,刪除已有任務。定時任務有很多實現的方式,包括timer,timertask,scheduledexecutorservice,以及第三方框架Quartz。本篇文章主要介紹SpringBoot整合Quartz實現動態定時任務。

1、Quartz是功能強大的開源作業調度庫,可以創建簡單或複雜的計劃,可以運行十個,百個,甚至幾萬個Jobs這樣複雜的日程序表。

2、quartz的基本組成如下:

Scheduler - 核心調度器,scheduler被用來對Trigger和Job進行管理

Job - 任務,Job是一個任務接口,需要實現該接口execute方法

JobDetail - 任務描述,JobDetail是任務的定義,而Job是任務的執行邏輯

Trigger - 觸發器,Trigger是用來定義Job的執行規則,主要有四種觸發器,其中         SimpleTrigger和CronTrigger使用最多

Quarqz的應用

Quartz的典型使用場景,主要就是用來執行定時任務,例如:定時發送信息,定時生成報表,自動更新靜態數據等等。接下來結合接口測試平臺,首先看看需求中定時任務要實現的功能,如下圖:

其中主要功能包括創建,編輯,刪除,暫停,恢復等基本功能,對於創建定時任務的規則,按照每天指定時間,或者間隔多少小時循環執行定時任務,循環次數是可進行限制的。最重要的當用戶操作時,在作業調度scheduler中,動態添加,更新,刪除任務等,不需要重啟服務即可實現。

1、在工程pom文件中,添加依賴

2、添加配置

因為springBoot已經集成了quartz,所以直接配置application.yaml文件即可;這裡使用了quartz的默認配置,所以沒有在yaml文件中自定義定時任務的配置,這裡說下quartz的兩種基本作業存儲類型RAMJobStore和JDBC作業存儲,兩種類型的優缺點如下:

RAMJobStore

JDBC作業存儲

因為本篇採用默認配置,所以存儲類型是RAMJobStore。同樣,可以根據項目特點進行切換,需要在application.yaml配置中增加如下配置信息,以及按照官方文檔提供sql創建數據表。本篇不過多介紹這種方式。

3、添加quartz配置

spring通過SchedulerFactoryBean來管理Quartz的生命周期。在spring啟動容器時啟動調度器,在spring關閉容器時關閉調度器。

4、創建任務,實現Job,其只有一個方法execute方法,主要編寫定時任務的處理邏輯。

5、定義定時任務的操作

包括服務啟動時開始執行全部任務timingTask,新增addJob,更新updateJob,操作operateJob(刪除,暫停,恢復)。

服務層對接口進行實現,將觸發器Trigger設定的觸發規則,以及任務描述JobDetail,交給作業調度Scheduler進行管理。

這裡的觸發器採用的是SimpleTrigger。

 6、定義接口

將用戶提交的信息保存到資料庫中,同時調用創建定時任務的接口,將它交給調度作業Scheduler進行管理,這樣實現了動態的定時任務,不需要進行停機再啟動就可以添加,編輯等,對正在運行任務進行操作。

7、定時任務表設計如下圖:

8、執行效果如下圖:

9、服務啟動時,將所有表中已存在任務添加到調度作業進行管理。

註:SpringBoot在項目啟動後會遍歷所有實現CommandLineRunner的實體類並執行run方法。

到這裡本篇介紹的內容就結束了,Quartz功能的確很強大,與SpringBoot的框架整合也很方便,可以滿足很多複雜的調度需求,對於初次接觸Quartz的我來說,上手還是相對比較簡單方便,在這裡給大家提個醒,所有的技術,不是越高端越好,而是要根據需求選擇適合的技術去實現。

友情提醒:

1、如果採用內存作業存儲類型,重啟後執行次數會被清零,所以有這方面需求的小夥伴,記得採用資料庫作業存儲類型;

2、針對於Quartz集群部署情況,建議採用資料庫作業存儲類型,因為集群中每個節點是一個獨立的Quartz應用,該集群需要分別對每個節點進行啟動和停止操作,不像普通的服務集群。Quartz應用是通過資料庫表來感知另一個應用,只有持久化的JobStore才能完成Quartz集群。如果採用內存作業存儲類型,分布式部署需要增加鎖機制,例如:redis鎖等,防止重複多次執行。

相關焦點

  • SpringBoot定時任務:schedule、quartz
    所以需要使用Scheduled定時任務機制時,需要在工程中依賴對應資源,具體如下:如果在spring應用中需要啟用Scheduled定時任務,則需要在啟動類上增加註解@EnableScheduling,代表啟用Scheduled定時任務機制。
  • 基於Spring整合Quartz集群的定時任務應用
    今天跟大家分享基於Spring整合Quartz集群的定時任務應用的知識。
  • SpringBoot整合Quartz調度框架實現任務調度(附學習源碼)
    來源:gyoomi.blog.csdn.net/article/details/83382000定時任務調度是Java開發中不可或缺的重要部分,但是Java自帶的Time等任務調度類在實際項目中不好用。
  • 定時任務的 5 種創建方式,還有誰不會!!
    支持生成定時任務表達式和反解析,使用Quartz表達式的定時任務如下:一、定時任務的五種創建方式     <dependency>          <groupId>org.quartz-scheduler</groupId>
  • Spring 整合 Quartz 分布式調度
    為了保證應用的高可用和高並發性,一般都會部署多個節點;對於定時任務,如果每個節點都執行自己的定時任務,一方面耗費了系統資源,另一方面有些任務多次執行,可能引發應用邏輯問題,所以需要一個分布式的調度系統,來協調每個節點執行定時任務。
  • 學會這 10 種定時任務,我有點飄了
    使用spring task的優缺點:優點:spring 框架自帶的定時功能,springboot 做了非常好的封裝,開啟和定義定時任務非常容易,支持複雜的cron表達式,可以滿足絕大多數單機版的業務場景。單個任務時,當前次的調度完成後,再執行下一次任務調度。
  • 我有 10 種方法搞定定時任務,10種!
    前言最近有幾個讀者私信給我,問我他們的業務場景,要用什麼樣的定時任務。確實,在不用的業務場景下要用不同的定時任務,其實我們的選擇還是挺多的。我今天給大家總結10種非常實用的定時任務,總有一種是適合你的。
  • Java定時任務的五種創建方式,你都會麼?
    ,使用Quartz表達式的定時任務如下一、job 定時任務的五種創建方式/**  * TODO  使用線程創建 job 定時任務  * @author 王松  */public class JobThread {    public static class Demo01 {
  • Spring Boot實現定時任務新解,你是否能get到?
    在日常的開發過程中經常使用到定時任務,在springMVC的開發中,經常和quartz框架進行集成使用,但在springboot中沒有這麼做,而是使用了java的線程池來實現定時任務。一、概述在springboot中使用定時任務非常簡單,只需要簡單的幾步即可完成。
  • SpringBoot2.0.3之quartz集成,不是你想的那樣哦!
    Timer這個相信大家都有用過,我也用過,但用的不多;特點是:簡單易用,但由於所有任務都是由同一個線程來調度,因此所有任務都是串行執行的,同一時間只能有一個任務在執行,前一個任務的延遲或異常都將會影響到之後的任務;能實現簡單的定時任務,稍微複雜點(或要求高一些)的定時任務卻不好實現。
  • Java定時任務調度詳解
    定時任務的場景可以說非常廣泛,比如某些視頻網站,購買會員後,每天會給會員送成長值,每月會給會員送一些電影券;比如在保證最終一致性的場景中,往往利用定時任務調度進行一些比對工作;比如一些定時需要生成的報表、郵件;比如一些需要定時清理數據的任務等。
  • 如何使用 Spring + WebSocket + Quartz 實現消息定時推送?
    接下來我們主要講第三種,使用websocket協議,來實現服務端定時向客戶端推送消息。--  spring-support.jar 這個jar 文件包含支持UI模版(Velocity,FreeMarker,JasperReports),郵件服務,腳本服務(JRuby),緩存Cache(EHCache),任務計劃Scheduling(uartz)方面的類。
  • 實戰Spring Boot 2.0系列:單機定時任務的幾種實現
    前言定時任務一般會存在 中大型企業級 項目中,為了減少 伺服器、資料庫 的壓力,往往會以 定時任務 的方式去完成某些業務邏輯。還有就是 報表的生成,我們一般會在客戶 訪問量小時完成這個操作,也可以採用 定時任務 來完成。
  • Java實現終止線程池中正在運行的定時任務
    最近項目中遇到了一個新的需求,就是實現一個可以動態添加定時任務的功能。說到這裡,有人可能會說簡單啊,使用quartz就好了,簡單粗暴。然而quartz框架太重了,小項目根本不好操作啊。當然,也有人會說,jdk提供了timer的接口啊,完全夠用啊。
  • springboot整合redis簡單案例
    前言:這裡簡單介紹下springboot整合redis(window版),以及簡單的測試demo。根據當前自己電腦的系統下載對應的redis版本,我這裡是以window版本作為測試的 demo。下載完直接解壓到自定義的目錄,如下:雙擊運行redis-server.exe,如下說明redis啟動成功:在創建的springboot項目的配置文件中,配置如下:創建配置類:
  • spring security 整合 springboot 入門案例
    序言前面我們學習了 spring security 與 springmvc 的整合入門教程。這一節我們來學習一下 spring security 與 springboot 整合,為了力求簡單,此處不演示資料庫相關操作。
  • 分布式定時任務框架選型,寫得太好了!
    ❞很多業務場景需要我們某一特定的時刻去做某件任務,定時任務解決的就是這種業務場景。一般來說,系統可以使用消息傳遞代替部分定時任務,兩者有很多相似之處,可以相互替換場景。如,上面發貨成功發簡訊通知客戶的業務場景,我們可以在發貨成功後發送MQ消息到隊列,然後去消費mq消息,發送簡訊。
  • Springboot整合easyExcel導入導出Excel
    點擊上方藍色字體,選擇「標星公眾號」優質文章,第一時間送達  作者 |  Code2020來源 |  urlify.cn/BFnIrq背景:最近公司有個需求要求可以導入、導出excel,因此在此記錄學習一下如何使用Springboot整合
  • Redis 延時任務(高手養成篇)
    引言在開發中,往往會遇到一些關於延時任務的需求。例如對上述的任務,我們給一個專業的名字來形容,那就是延時任務。那麼這裡就會產生一個問題,這個延時任務和定時任務的區別究竟在哪裡呢?一共有如下幾點區別定時任務有執行周期,而延時任務在某事件觸發後一段時間內執行,沒有執行周期定時任務一般執行的是批處理操作是多個任務,而延時任務一般是單個任務下面,我們以判斷訂單是否超時為例,進行方案分析方案分析(1)資料庫輪詢思路