SpringBoot整合Quartz調度框架實現任務調度(附學習源碼)

2022-01-10 Java基基

點擊上方「Java基基」,選擇「設為星標」

做積極的人,而不是積極廢人!

來源:gyoomi.blog.csdn.net/article/details/83382000

定時任務調度是Java開發中不可或缺的重要部分,但是Java自帶的Time等任務調度類在實際項目中不好用。所以Quartz和Spring Task就成了我們項目開發技術選型最多的,在這裡我們著重探討一下Quartz在Spring Boot 2.X版本中的使用。

Quartz是OpenSymphony開源組織在Job scheduling領域的開源項目,它可以與J2EE與J2SE應用程式相結合也可以單獨使用。Quartz可以用來創建簡單或為運行十個,百個,甚至是好幾萬個Jobs這樣複雜的日程序表。Jobs可以做成標準的Java組件或 EJBs。

Quartz是一個任務日程管理系統,一個在預先確定(被納入日程)的時間到達時,負責執行(或者通知)其他軟體組件的系統。

Quartz用一個小Java庫發布文件(.jar文件),這個庫文件包含了所有Quartz核心功能。這些功能的主要接口(API)是Scheduler接口。它提供了簡單的操作,例如:將任務納入日程或者從日程中取消,開始/停止/暫停日程進度。

官方網站:

http://quartz-scheduler.org/

圖片

多個定時的圖示如下:

圖片

對比下配置xml中的配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

    <!--
        Spring整合Quartz進行配置遵循下面的步驟:
        1:定義工作任務的Job
        2:定義觸發器Trigger,並將觸發器與工作任務綁定
        3:定義調度器,並將Trigger註冊到Scheduler
     -->
    <!-- 1:定義任務的bean ,這裡使用JobDetailFactoryBean,也可以使用MethodInvokingJobDetailFactoryBean ,配置類似-->
    <bean name="hwJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <!-- 指定job的名稱 -->
        <property name="name" value="hw_job"/>
        <!-- 指定job的分組 -->
        <property name="group" value="hw_group"/>
        <!-- 指定具體的job類 -->
        <property name="jobClass" value="com.dufy.spring.quartz.chapter01.job.HelloWorldJob"/>
        <!-- 必須設置為true,如果為false,當沒有活動的觸發器與之關聯時會在調度器中會刪除該任務  -->
        <property name="durability" value="true"/>
        <!-- 指定spring容器的key,如果不設定在job中的jobmap中是獲取不到spring容器的 -->
        <property name="applicationContextJobDataKey" value="applicationContext"/>
    </bean>
    <!-- 2.1:定義觸發器的bean,定義一個Simple的Trigger,一個觸發器只能和一個任務進行綁定 -->
    <!-- <bean name="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        指定Trigger的名稱
        <property name="name" value="hw_trigger"/>
        指定Trigger的名稱
        <property name="group" value="hw_trigger_group"/>
        指定Tirgger綁定的Job
        <property name="jobDetail" ref="hwJob"/>
        指定Trigger的延遲時間 1s後運行
        <property name="startDelay" value="1000"/>
        指定Trigger的重複間隔  5s
        <property name="repeatInterval" value="5000"/>
        指定Trigger的重複次數
        <property name="repeatCount" value="5"/>
    </bean> -->

    <!-- 2.2:定義觸發器的bean,定義一個Cron的Trigger,一個觸發器只能和一個任務進行綁定 -->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!-- 指定Trigger的名稱 -->
        <property name="name" value="hw_trigger"/>
        <!-- 指定Trigger的名稱 -->
        <property name="group" value="hw_trigger_group"/>
        <!-- 指定Tirgger綁定的Job -->
        <property name="jobDetail" ref="hwJob"/>
        <!-- 指定Cron 的表達式 ,當前是每隔1s運行一次 -->
        <property name="cronExpression" value="0/1 * * * * ?" />
    </bean>


    <!-- 3.定義調度器,並將Trigger註冊到調度器中 -->
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <!-- <ref bean="simpleTrigger"/> -->
                <ref bean="cronTrigger"/>
            </list>
        </property>
        <!-- <property name="autoStartup" value="true" /> -->
    </bean>

</beans>

項目是基於Spring Boot2.x版本的。

圖片
<!-- quartz依賴 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

圖片

application-quartz.yml的配置內容如下

spring:
  quartz:
    #相關屬性配置
    properties:
      org:
        quartz:
          scheduler:
            instanceName: clusteredScheduler
            instanceId: AUTO
          jobStore:
            class: org.quartz.impl.jdbcjobstore.JobStoreTX
            driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
            tablePrefix: QRTZ_
            isClustered: true
            clusterCheckinInterval: 10000
            useProperties: false
          threadPool:
            class: org.quartz.simpl.SimpleThreadPool
            threadCount: 10
            threadPriority: 5
            threadsInheritContextClassLoaderOfInitializingThread: true
    #資料庫方式
    job-store-type: jdbc
    #初始化表結構
    #jdbc:
      #initialize-schema: never

簡單任務

圖片

代碼如下:

public class MyJob extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("start My Job:" + LocalDateTime.now());
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("end My Job:" + LocalDateTime.now());

    }
}

CRON任務

圖片
public class MyCronJob extends QuartzJobBean {

    @Autowired
    IndexController indexController;

    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("任務執行了" + new Date());
        // indexController.testMail();
    }
}

@Configuration
public class QuartzConfiguration {

 // 使用jobDetail包裝job
    @Bean
    public JobDetail myJobDetail() {
        return JobBuilder.newJob(MyJob.class).withIdentity("myJob").storeDurably().build();
    }

 // 把jobDetail註冊到trigger上去
    @Bean
    public Trigger myJobTrigger() {
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(15).repeatForever();

        return TriggerBuilder.newTrigger()
                .forJob(myJobDetail())
                .withIdentity("myJobTrigger")
                .withSchedule(scheduleBuilder)
                .build();
    }

 // 使用jobDetail包裝job
    @Bean
    public JobDetail myCronJobDetail() {
        return JobBuilder.newJob(MyCronJob.class).withIdentity("myCronJob").storeDurably().build();
    }

 // 把jobDetail註冊到Cron表達式的trigger上去
    @Bean
    public Trigger CronJobTrigger() {
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/10 * * * * ?");

        return TriggerBuilder.newTrigger()
                .forJob(myCronJobDetail())
                .withIdentity("myCronJobTrigger")
                .withSchedule(cronScheduleBuilder)
                .build();
    }
}

其實上面的配置就等價於在傳統的xml中配置bean是一樣的。

圖片

至此,SpringBoot集成Quartz的完畢。

Spring Boot集成quartz還是比較簡單的。

其實還有更高級的用法,就是前臺動態創建和控制定時任務,後面有時間再完善。大家先把這種最簡單的基本用法熟練掌握。

圖片圖片首先點擊右下方在看,再長按下方二維碼關注哦,並後臺回復二維碼


歡迎加入我的知識星球,一起探討架構,交流源碼。加入方式,長按下方二維碼噢

已在知識星球更新源碼解析如下:

最近更新《芋道 SpringBoot 2.X 入門》系列,已經 20 餘篇,覆蓋了 MyBatis、Redis、MongoDB、ES、分庫分表、讀寫分離、SpringMVC、Webflux、權限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能測試等等內容。

提供近 3W 行代碼的 SpringBoot 示例,以及超 4W 行代碼的電商微服務項目。

獲取方式:點「在看」,關注公眾號並回復 666 領取,更多內容陸續奉上。

文章有幫助的話,在看,轉發吧。

謝謝支持喲 (*^__^*)

相關焦點

  • 初探SpringBoot整合Quartz定時任務
    定時任務有很多實現的方式,包括timer,timertask,scheduledexecutorservice,以及第三方框架Quartz。本篇文章主要介紹SpringBoot整合Quartz實現動態定時任務。1、Quartz是功能強大的開源作業調度庫,可以創建簡單或複雜的計劃,可以運行十個,百個,甚至幾萬個Jobs這樣複雜的日程序表。
  • Spring 整合 Quartz 分布式調度
    為了保證應用的高可用和高並發性,一般都會部署多個節點;對於定時任務,如果每個節點都執行自己的定時任務,一方面耗費了系統資源,另一方面有些任務多次執行,可能引發應用邏輯問題,所以需要一個分布式的調度系統,來協調每個節點執行定時任務。
  • SpringBoot定時任務:schedule、quartz
    Scheduled只適合處理簡單的計劃任務,不能處理分布式計劃任務。優勢:是spring框架提供的計劃任務,開發簡單,執行效率比較高。且在計劃任務數量太多的時候,可能出現阻塞,崩潰,延遲啟動等問題。Scheduled定時任務是spring3.0版本之後自帶的一個定時任務。
  • 幾種任務調度的 Java 實現方法與比較
    >>> 綜觀目前的 Web 應用,多數應用都具備任務調度的功能。本文由淺入深介紹了幾種任務調度的 Java 實現方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,並對其優缺點進行比較,目的在於給需要開發任務調度的程式設計師提供有價值的參考。
  • java任務調度之Timer定時器(案例和源碼分析)
    一、Timer基本使用在Java中為我們提供了Timer來實現定時任務,當然現在還有很多定時任務框架,比如說Spring、QuartZ、Linux Cron等等,而且性能也更加優越。但是我們想要深入的學習就必須先從最簡單的開始。
  • 3千字帶你搞懂XXL-JOB任務調度平臺
    二、為什麼需要任務調度平臺在Java中,傳統的定時任務實現方案,比如Timer,Quartz等都或多或少存在一些問題:不支持集群、不支持統計、沒有管理平臺、沒有失敗報警、沒有監控等等而且在現在分布式的架構中
  • 乾貨|新手也能看懂的源碼閱讀技巧
    讀源碼的經歷剛參加工作那會,沒想過去讀源碼,更沒想過去改框架的源碼;總想著別人的框架應該是完美的、萬能的,應該不需要改;另外即使我改了源碼,怎麼樣讓我的改動生效了?項目中引用的不還是沒改的jar包嗎。說的好聽點是有匠人精神;說的委婉點是好奇(底層是怎麼實現的);說的不自信點是對黑盒的東西我用的沒底,怕用錯;說的簡單直白點是提升自我價值,為了更高的薪資待遇(這裡對真正的技術迷說聲抱歉)。源碼中我們可以學到很多東西,學習別人高效的代碼書寫、學習別人對設計模式的熟練使用、學習別人對整個架構的布局,等等。如果你還能找出其中的不足,那麼恭喜你,你要飛升了!
  • Java項目中使用XXL-JOB調度框架
    Java項目中使用XXL-JOB調度框架我們的最近幾個新項目在使用XXL-JOB進行任務調度,今天就分享下這個框架。XXL-JOB是一個分布式任務調度平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。現已開放原始碼並接入多家公司線上產品線,開箱即用。
  • 學會這 10 種定時任務,我有點飄了
    缺點:如果定時任務非常多,不太好找,而且必須要求作業系統是linux,否則無法執行。二. jdk 自帶的定時任務1.Thread各位親愛的朋友,你沒看錯,Thread類真的能做定時任務。如果你看過一些定時任務框架的源碼,你最後會發現,它們的底層也會使用Thread類。
  • SpringBoot2.0.3之quartz集成,不是你想的那樣哦!
    Timer這個相信大家都有用過,我也用過,但用的不多;特點是:簡單易用,但由於所有任務都是由同一個線程來調度,因此所有任務都是串行執行的,同一時間只能有一個任務在執行,前一個任務的延遲或異常都將會影響到之後的任務;能實現簡單的定時任務,稍微複雜點(或要求高一些)的定時任務卻不好實現。
  • 我有 10 種方法搞定定時任務,10種!
    缺點:如果定時任務非常多,不太好找,而且必須要求作業系統是linux,否則無法執行。二. jdk自帶的定時任務1.Thread各位親愛的朋友,你沒看錯,Thread類真的能做定時任務。如果你看過一些定時任務框架的源碼,你最後會發現,它們的底層也會使用Thread類。
  • opencron v1.0.1 發布,分布式任務調度系統
    opencron 是一個功能完善且通用的開源定時任務調度系統,擁有先進可靠的自動化任務管理調度功能,提供可操作的web圖形化管理滿足多種場景下各種複雜的定時任務調度
  • 基於Spring整合Quartz集群的定時任務應用
    今天跟大家分享基於Spring整合Quartz集群的定時任務應用的知識。
  • 分布式調度系統XXL-JOB安裝和簡單使用
    安裝執行器項目很簡單,基本上就是安裝調度中心那樣安裝啟動即可,我們這裡為了簡單起見,可以直接啟動 xxl-job 自帶Spring Boot的簡單執行器。基於上面克隆下來的項目,我們進入 /xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/target 目錄。
  • XXL-JOB v1.6.0 發布,分布式任務調度平臺
    ;9、GLUE模式任務實例更新邏輯優化,原根據超時時間更新改為根據版本號更新,源碼變動版本號加一;《分布式任務調度平臺XXL-JOB》一、簡介1.1 概述XXL-JOB是一個輕量級分布式任務調度框架,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。
  • PowerJob全新一代分布式調度與計算框架
    PowerJob(原OhMyScheduler)是全新一代分布式調度與計算框架,能讓您輕鬆完成作業的調度與繁雜任務的分布式計算。簡介主要特性使用簡單:提供前端Web界面,允許開發者可視化地完成調度任務的管理(增、刪、改、查)、任務運行狀態監控和運行日誌查看等功能。
  • 這些常用ETL批量任務調度平臺框架組件,你都知道幾個?
    Cron-like Scheduler1.1 Python任務調度框架 APScheduler一個基於Python,提供類似Cron功能,並深受Java Quartz 影響的輕量級進程內任務調度框架。框架工具資源:1.2 任務調度框架 cron4jcron4j 是一個Java的任務調度框架,類似於UNIX系統下的crontab.使用示例:1.3 conclusion:not web-based applicationneed to programjust only scheduler2.
  • Uncode-Schedule 1.0.3 發布,分布式任務調度組件
    Uncode-Schedule分布式任務調度組件,非常小巧,無需任何修改就可以使quartz/spring task具備分布式特性
  • 分布式定時任務框架選型,寫得太好了!
    TimerTask類是一個定時任務類,該類實現了Runnable接口,缺點異常未檢查會中止線程ScheduledExecutorService:相對延遲或者周期作為定時任務調度,缺點沒有絕對的日期或者時間spring定時框架:配置簡單功能較多,如果系統使用單機的話可以優先考慮spring定時器分布式Quartz:Java事實上的定時任務標準。
  • Kubernetes 調度詳解!
    節點親和力**節點親和力(Node Affinity)是在 Pod 上定義的一組約束,用於確定哪些節點適合進行調度,即使用親和性規則為 Pod 的節點分配定義硬性要求和軟性要求。**例如可以將 Pod 配置為僅運行帶有 GPU 的節點,並且最好使用 NVIDIA_TESLA_V100 運行深度學習工作負載。