Spring 整合 Quartz 分布式調度

2021-03-02 OSC開源社區

#掃描上方二維碼進入報名#

本文旨在對 Spring+Quartz 分布式調度有一個直觀的了解,通過實際的使用來解決問題。

為了保證應用的高可用和高並發性,一般都會部署多個節點;對於定時任務,如果每個節點都執行自己的定時任務,一方面耗費了系統資源,另一方面有些任務多次執行,可能引發應用邏輯問題,所以需要一個分布式的調度系統,來協調每個節點執行定時任務。

Quartz是一個成熟的任務調度系統,Spring對Quartz做了兼容,方便開發,下面看看具體如何整合:

1.Maven依賴文件

主要就是Spring相關庫、quartz庫以及mysql驅動庫,註:分布式調度需要用到資料庫,這裡選用mysql;

2.配置job


提供了兩種方式來配置job,分別是:MethodInvokingJobDetailFactoryBean和JobDetailFactoryBean


2.1MethodInvokingJobDetailFactoryBean


要調用特定bean的一個方法的時候使用,具體配置如下:

2.2JobDetailFactoryBean


這種方式更加靈活,可以設置傳遞參數,具體如下:

jobClass定義的任務類,繼承QuartzJobBean,實現executeInternal方法;jobDataMap用來給job傳遞數據;

3.配置調度使用的觸發器


同樣提供了兩種觸發器類型:SimpleTriggerFactoryBean和CronTriggerFactoryBean
重點看CronTriggerFactoryBean,這種類型更加靈活,具體如下:

jobDetail指定的就是在步驟2中配置的job,cronExpression配置了每5秒執行一次job;

4.配置Quartz調度器的SchedulerFactoryBean


同樣提供了兩種方式:內存RAMJobStore和資料庫方式


4.1內存RAMJobStore


job的相關信息存儲在內存裡,每個節點存儲各自的,互相隔離,配置如下:

4.2資料庫方式


job的相關信息存儲在資料庫中,所有節點共用資料庫,每個節點通過資料庫來通信,保證一個job同一時間只會在一個節點上執行,並且如果某個節點掛掉,job會被分配到其他節點執行,具體配置如下:

dataSource用來配置數據源,數據表相關信息,可以到官網下載gz包,sql文件在路徑:docs\dbTables下,裡面提供了主流資料庫的sql文件,總共11張表;


configLocation配置的quartz.properties文件在quartz.jar的org.quartz包下,裡面提供了一些默認的數據,比如org.quartz.jobStore.class

這裡需要將quartz.properties拷貝出來做一些修改,具體修改如下:

5.相關類

FirstTask繼承QuartzJobBean,實現executeInternal方法,調用FirstService;

public class FirstService implements Serializable {

 

    private static final long serialVersionUID = 1L;

 

    public void service() {

        System.out.println(new SimpleDateFormat("YYYYMMdd HH:mm:ss").format(new Date()) + "---start FirstService");

        try {

            Thread.sleep(2000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        System.out.println(new SimpleDateFormat("YYYYMMdd HH:mm:ss").format(new Date()) + "---end FirstService");

    }

}


FirstService需要提供序列化接口,因為需要保存在資料庫中;

主類用來加載quartz配置文件;

1.同時啟動App兩次,觀察日誌:

其中A1有日誌輸出,A2沒有;當停掉A1以後,A2有日誌輸出;

2.添加新的job分別新建:SecondTask和SecondService,同時添加相關配置文件,啟動App觀察日誌:


A1日誌如下:

A2日誌如下:

可以發現A1和A2都有執行任務,但是同一任務同一時間只會在一個節點執行,並且只有在執行結束後才有可能分配到其他節點;

3.如果間隔時間小於任務執行時間,比如這裡改成sleep(6000)


A1日誌如下:

A2日誌如下:

間隔時間是5秒,而任務執行需要6秒,觀察日誌可以發現,任務還沒有結束,新的任務已經開始,這種情況可能引發應用的邏輯問題,其實就是任務能不能支持串行的問題;

4.@DisallowConcurrentExecution註解保證任務的串行


在FirstTask和SecondTask上分別添加@DisallowConcurrentExecution註解,日誌結果如下:


A1日誌如下:

A2日誌如下:

觀察日誌可以發現,任務只有在end以後,才會開始新的任務,實現了任務的串行化;

本文旨在對Spring+Quartz分布式調度有一個直觀的了解,通過實際的使用來解決問題,當然可能還有很多疑問比如它是如何調度的,資料庫如果掛了會怎麼樣等等,還需要做更加深入的了解。


相關焦點

  • Uncode-Schedule 1.0.3 發布,分布式任務調度組件
    Uncode-Schedule分布式任務調度組件,非常小巧,無需任何修改就可以使quartz/spring task具備分布式特性
  • SpringBoot定時任務:schedule、quartz
    Scheduled只適合處理簡單的計劃任務,不能處理分布式計劃任務。優勢:是spring框架提供的計劃任務,開發簡單,執行效率比較高。且在計劃任務數量太多的時候,可能出現阻塞,崩潰,延遲啟動等問題。Scheduled定時任務是spring3.0版本之後自帶的一個定時任務。
  • PowerJob全新一代分布式調度與計算框架
    PowerJob(原OhMyScheduler)是全新一代分布式調度與計算框架,能讓您輕鬆完成作業的調度與繁雜任務的分布式計算。簡介主要特性使用簡單:提供前端Web界面,允許開發者可視化地完成調度任務的管理(增、刪、改、查)、任務運行狀態監控和運行日誌查看等功能。
  • Spring全家桶、Dubbo、分布式、消息隊列後端必備全套開源項目
    在帶你快速學會 Job 任務的編寫的同時,我還想告訴你還有 Quartz 單體、Quartz 集群、XXL-JOB 等等企業使用更多的調度平臺。...讓我們一起愉快的挖坑,挖深坑,哇哈哈。整合 Sentinel」小節《Spring Cloud Alibaba 服務調用 Dubbo 入門》的「6.
  • 分布式調度系統XXL-JOB安裝和簡單使用
    我看了一下 GitHub 上開源的分布式調度系統,目前是 xxl-job 項目是分布式調度開源系統中最多 starts 的(當然也有可能因為這個 xxl-job 出來挺久了)window ,mac 或docker 安裝如果為 window,mac 等安裝,可以先根據github 上的 SQL
  • 華為自爆宇宙級:基於SpringBoot+Cloud微服務分布式架構實戰手冊
    通過學習前半部分的內容,你可以基本搭建Consul集群、多個微服務、微服務間通信、負載均衡、斷路器的分布式基本結構,後半部分的內容主要介紹如何編寫微服務業務代碼,包括Spring Boot、 MySQL、 Redis、 緩存一致性、事務、異步線程池、分布式消息通信、分布式任務調度管理及FastDFS分布式文件管理。
  • Uncode-Schedule 1.1.0 發布,分布式任務調度組件
    Uncode-Schedule 分布式任務調度組件,非常小巧,目前還是保持一個 jar 包,確保所有任務在集群中不重複,不遺漏的執行
  • opencron v1.0.1 發布,分布式任務調度系統
    opencron 是一個功能完善且通用的開源定時任務調度系統,擁有先進可靠的自動化任務管理調度功能,提供可操作的web圖形化管理滿足多種場景下各種複雜的定時任務調度
  • 專訪當當網張亮:深度解讀分布式作業調度框架elastic-job
    日前,筆者採訪了當當網架構師、噹噹技術委員會成員張亮,在本次採訪中他主要分享了對架構師的理解,以及重點解讀了分布式作業調度框架Elastic-job是什麼、架構設計思路、具體模塊的底層及如何實現等。
  • 3千字帶你搞懂XXL-JOB任務調度平臺
    ,有一些場景需要分布式任務調度:同一個服務多個實例的任務存在互斥時,需要統一的調度。顯然傳統的定時任務已經不滿足現在的分布式架構,所以需要一個分布式任務調度平臺,目前比較主流的是elasticjob和xxl-job。elasticjob由當當網開源,目前github有6.5k的Star,使用的公司在官網登記有76家。
  • Spring-Task源碼解析
    scheduler初始化任務調度TriggerCron解析調度總結>任務的定時調度/執行,對應xml配置的task:scheduler和task:scheduled-tasks標籤。其beanClass為org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler。
  • Spring Boot 整合 Thymeleaf
    整合過程2.1 添加 Thymeleaf 依賴2.2 編寫實體類和 Controller2.3 創建 Thymeleaf 模板2.4 測試整合過程2.1 添加 Thymeleaf 依賴添加 Thymeleaf 依賴有兩種方式:在新建項目時添加,在 Templeate Engines 中勾選 Thymeleaf;對於未添加 Thymeleaf 依賴的項目,
  • spring boot 整合shiro 錯誤
    最近在弄spring boot 整合shiro的。凱哥現在用的是spring boot。web.xml沒有。但是凱哥配置了shiro的核心攔截器啊。如下圖:並且使用了@Configuration這個註解了。
  • 幾種任務調度的 Java 實現方法與比較
    可以看出,用上述方法實現該任務調度比較麻煩,這就需要一個更加完善的任務調度框架來解決這些複雜的調度問題。幸運的是,開源工具包 Quartz 與 JCronTab 提供了這方面強大的支持。 Quartz Quartz 可以滿足更多更複雜的調度需求,首先讓我們看看如何用 Quartz 實現每星期二 16:38 的調度安排: package com.ibm.scheduler;import java.util.Date;import org.quartz.Job
  • XXL-JOB v2.1.0 發布,分布式任務調度平臺
    v2.1.0 Release Notes簡介XXL-JOB是一個輕量級分布式任務調度平臺,其核心設計目標是開發迅速
  • springcloud五大組件
    首先我們來看springcloud是什麼?它是微服務架構集大成者,基於springboot構建,可以將一系列優秀組件進行完美整合。對熟悉的程式設計師來說,上手不麻煩,對新手來說,就需要了解springcloud架構再去學習。
  • spring security 整合 springboot 入門案例
    序言前面我們學習了 spring security 與 springmvc 的整合入門教程。這一節我們來學習一下 spring security 與 springboot 整合,為了力求簡單,此處不演示資料庫相關操作。
  • SpringBoot+ Dubbo + Mybatis + Nacos +Seata整合來實現Dubbo分布式事務
    1.簡介「本文主要介紹SpringBoot2.1.5 + Dubbo 2.7.3 + Mybatis 3.4.2 + Nacos 1.1.3 +Seata 0.8.0整合來實現Dubbo分布式事務管理,使用Nacos 作為 Dubbo和Seata的註冊中心和配置中心,使用 MySQL 資料庫和 MyBatis來操作數據。
  • XXL-JOB v1.6.0 發布,分布式任務調度平臺
    6、CleanCode,清理無效的歷史參數;7、底層擴展數據結構以及相關表結構調整;8、新建任務默認為非運行狀態;9、GLUE模式任務實例更新邏輯優化,原根據超時時間更新改為根據版本號更新,源碼變動版本號加一;《分布式任務調度平臺
  • NutzWk 5.2.6 發布,Java 微服務分布式開發框架
    項目介紹:NutzWk 是有五年多歷史的Java Web開源開發框架,其5.x 是Java 微服務分布式版本,採用nutzboot(nutz核心)、dubbo、redis、zookeeper、shiro、quartz、beetl、logback、vue、sentinel(流控框架,可選)、seata(分布式事務,可選) 等開源技術的微服務分布式版本,自帶系統管理、簡易CMS、微信模塊、定時任務、服務API等功能,目前已應用於全國各地上千個各類商業項目中。