深入學習:SpringQuartz的配置方式!

全文目錄:

    • 開篇語
    • 前言
    • 摘要
    • 概述
    • 1. 基于 XML 的傳統配置
      • 配置步驟
        • 1.1 Maven 依賴
        • 1.2 XML 配置文件
        • 1.3 實現 Job 類
    • 2. 基于 Java Config 的現代配置方式
      • 配置步驟
        • 2.1 Maven 依賴
        • 2.2 配置類
        • 2.3 實現 Job 類
    • 3. 動態任務調度
      • 動態添加任務
      • 動態刪除任務
    • 4. Quartz 持久化配置
      • 配置數據庫
        • 數據庫腳本
        • 配置文件
      • 啟用持久化
    • 應用場景案例
    • 優缺點分析
      • 優點
      • 缺點
    • 小結
    • 總結
    • 文末

開篇語

哈嘍,各位小伙伴們,你們好呀,我是喵手。運營社區:C站/掘金/騰訊云/阿里云/華為云/51CTO;歡迎大家常來逛逛

??今天我要給大家分享一些自己日常學習到的一些知識點,并以文字的形式跟大家一起交流,互相學習,一個人雖可以走的更快,但一群人可以走的更遠。

??我是一名后端開發愛好者,工作日常接觸到最多的就是Java語言啦,所以我都盡量抽業余時間把自己所學到所會的,通過文章的形式進行輸出,希望以這種方式幫助到更多的初學者或者想入門的小伙伴們,同時也能對自己的技術進行沉淀,加以復盤,查缺補漏。

小伙伴們在批閱的過程中,如果覺得文章不錯,歡迎點贊、收藏、關注哦。三連即是對作者我寫作道路上最好的鼓勵與支持!

前言

在上一期文章中,我們詳細解析了 JVM 垃圾回收器的原理與調優策略,幫助大家掌握了如何通過優化 GC 來提升 Java 應用性能。然而,Java 開發的核心遠不止性能調優,任務調度也是企業級開發中不可或缺的一部分。

Quartz 是一個功能強大且靈活的任務調度框架,而結合 Spring 框架 使用,能夠更加高效、簡潔地實現定時任務調度功能。本期,我們將深入探討 SpringQuartz 的配置方式,從基礎配置到動態任務調度,逐步揭示 SpringQuartz 的強大功能與最佳實踐。


摘要

本文將系統講解 SpringQuartz 的幾種配置方式,包括:

  • 基于 XML 的傳統配置。
  • 基于 Java Config 的現代配置方式。
  • 動態任務調度與持久化配置。
  • 常見調試與優化技巧。

通過本文的學習,你將能夠輕松掌握如何在項目中集成 Quartz,快速搭建穩定高效的任務調度系統。


概述

Quartz 是一個開源的 Java 任務調度框架,提供了強大的調度功能,例如:

  • 基于 Cron 表達式的任務調度
  • 動態任務管理
  • 持久化任務存儲
  • 分布式任務調度支持

結合 Spring 框架 使用,可以利用 Spring 的依賴注入與事務管理能力,簡化任務調度的配置與開發。

SpringQuartz 的基本架構包含以下幾個關鍵組件:

  1. Job:任務邏輯的核心實現。
  2. Trigger:定義任務觸發的規則,例如 Cron 表達式。
  3. Scheduler:任務調度器,負責管理任務的執行。

以下,我們將以多種配置方式逐步展示 SpringQuartz 的強大功能。


1. 基于 XML 的傳統配置

這是 Quartz 最早期的集成方式,使用 Spring 的 XML 配置文件來定義調度器、任務和觸發器。

配置步驟

1.1 Maven 依賴

在項目的 pom.xml 中引入 Quartz 和 Spring 的依賴:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.2</version>
</dependency>
1.2 XML 配置文件

applicationContext.xml 中定義調度器、任務和觸發器:

<bean id="exampleJob" class="com.example.jobs.ExampleJob" /><bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject" ref="exampleJob" /><property name="targetMethod" value="execute" />
</bean><bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail" ref="jobDetail" /><property name="cronExpression" value="0/10 * * * * ?" /> <!-- 每10秒執行一次 -->
</bean><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="cronTrigger" /></list></property>
</bean>
1.3 實現 Job 類

創建 ExampleJob 類,包含任務邏輯:

package com.example.jobs;public class ExampleJob {public void execute() {System.out.println("Executing Job: " + System.currentTimeMillis());}
}

運行項目后,每隔 10 秒鐘會在控制臺打印 Executing Job


2. 基于 Java Config 的現代配置方式

隨著 Spring Boot 的流行,基于 Java Config 的配置方式逐漸成為主流,簡潔高效。

配置步驟

2.1 Maven 依賴

與 XML 配置相同,引入 Quartz 和 Spring Boot 的依賴。

2.2 配置類

通過 @Configuration 注解配置 Quartz:

import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class QuartzConfig {@Beanpublic JobDetail exampleJobDetail() {return JobBuilder.newJob(ExampleJob.class).withIdentity("exampleJob").storeDurably().build();}@Beanpublic Trigger exampleJobTrigger() {CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/10 * * * * ?");return TriggerBuilder.newTrigger().forJob(exampleJobDetail()).withIdentity("exampleTrigger").withSchedule(scheduleBuilder).build();}
}
2.3 實現 Job 類

創建 Quartz 的標準 Job 實現:

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;public class ExampleJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {System.out.println("Executing Job: " + System.currentTimeMillis());}
}

運行項目后,同樣會每隔 10 秒鐘執行一次任務。


3. 動態任務調度

實際項目中,任務調度往往需要動態添加、修改或刪除。以下是動態管理 Quartz 任務的示例。

動態添加任務

import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class QuartzService {@Autowiredprivate Scheduler scheduler;public void addJob(String jobName, String triggerName, String cronExpression) throws SchedulerException {JobDetail jobDetail = JobBuilder.newJob(ExampleJob.class).withIdentity(jobName).build();CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName).withSchedule(scheduleBuilder).forJob(jobDetail).build();scheduler.scheduleJob(jobDetail, trigger);}
}

調用 QuartzServiceaddJob 方法即可動態添加任務:

quartzService.addJob("dynamicJob", "dynamicTrigger", "0/15 * * * * ?");

動態刪除任務

public void removeJob(String jobName, String triggerName) throws SchedulerException {scheduler.unscheduleJob(new TriggerKey(triggerName));scheduler.deleteJob(new JobKey(jobName));
}

調用 removeJob 方法即可刪除指定任務。


4. Quartz 持久化配置

Quartz 提供了將任務存儲到數據庫的能力,以便在系統重啟后任務依然可用。

配置數據庫

數據庫腳本

Quartz 提供了創建任務表的 SQL 腳本(位于 Quartz 的官方文檔中),運行腳本以初始化數據庫。

配置文件

application.properties 中配置 Quartz 數據源:

spring.quartz.job-store-type=jdbc
spring.quartz.jdbc.initialize-schema=always
spring.datasource.url=jdbc:mysql://localhost:3306/quartzdb
spring.datasource.username=root
spring.datasource.password=123456

啟用持久化

在 Spring 配置中啟用持久化:

@Bean
public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {SchedulerFactoryBean factory = new SchedulerFactoryBean();factory.setDataSource(dataSource);factory.setOverwriteExistingJobs(true);return factory;
}

應用場景案例

  1. 定時數據同步:通過 Quartz 定時同步外部數據,例如定時抓取天氣數據或電商庫存信息。
  2. 消息推送系統:實現基于時間的消息推送功能,例如定時發送優惠信息。
  3. 任務處理調度:調度后臺任務,例如生成報表或清理日志。

優缺點分析

優點

  1. 配置靈活:支持 XML、Java Config 等多種配置方式。
  2. 動態管理:支持任務的動態添加、修改和刪除。
  3. 持久化支持:任務信息可持久化到數據庫,支持系統重啟后的任務恢復。
  4. 強大的觸發規則:支持 Cron 表達式及多種觸發器。

缺點

  1. 學習曲線較高:Quartz 的功能復雜,配置相對較繁瑣。
  2. 對分布式支持有限:需要與其他框架(如 Spring Cloud)結合實現分布式調度。

小結

SpringQuartz 是 Java 開發中任務調度的利器,通過靈活的配置方式,可以滿足絕大多數定時任務需求。本文從傳統 XML 配置到現代 Java Config,以及動態任務調度與持久化配置,全面解析了 SpringQuartz 的功能與使用場景。


總結

無論是簡單的任務調度,還是復雜的動態任務與持久化場景,SpringQuartz 都能提供強大支持。通過結合本文的學習與實踐,你將能夠在項目中靈活運用 Quartz,輕松構建高效、穩定的任務調度系統。

下一期,我們將繼續探索 分布式任務調度與 Quartz 在分布式架構中的應用,敬請期待!

… …

文末

好啦,以上就是我這期的全部內容,如果有任何疑問,歡迎下方留言哦,咱們下期見。

… …

學習不分先后,知識不分多少;事無巨細,當以虛心求教;三人行,必有我師焉!!!

wished for you successed !!!


??若喜歡我,就請關注我叭。

??若對您有用,就請點贊叭。
??若有疑問,就請評論留言告訴我叭。


版權聲明:本文由作者原創,轉載請注明出處,謝謝支持!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73622.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73622.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73622.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ClickHouse與TiDB實操對比:從入門到實戰的深度剖析

ClickHouse與TiDB實操對比&#xff1a;從入門到實戰的深度剖析 寶子們&#xff0c;在當今數據驅動的時代&#xff0c;選擇合適的數據庫對于處理海量數據和支撐業務發展至關重要。ClickHouse和TiDB作為兩款備受關注的數據庫&#xff0c;各自有著獨特的優勢和適用場景。今天&…

element-ui messageBox 組件源碼分享

messageBox 彈框組件源碼分享&#xff0c;主要從以下兩個方面&#xff1a; 1、messageBox 組件頁面結構。 2、messageBox 組件屬性。 一、組件頁面結構。 二、組件屬性。 2.1 title 標題&#xff0c;類型為 string&#xff0c;無默認值。 2.2 message 消息正文內容&#xf…

睡眠健康領域的智能硬件設備未來的發展趨勢

隨著社會節奏的不斷加快&#xff0c;人們的睡眠問題愈發多了起來&#xff0c;主要表現有以下幾個方面&#xff1a; 睡眠質量下降 淺睡眠增多&#xff1a;現代生活中&#xff0c;人們面臨著各種壓力源&#xff0c;如工作壓力、生活瑣事、經濟壓力等&#xff0c;這些壓力會導致大…

支付頁面安全與E-Skimming防護----淺談PCI DSS v4.0.1要求6.4.3與11.6.1的實施

關鍵詞&#xff1a;支付頁面安全、E-Skimming、PCI DSS v4.0.1、第三方腳本、風險管理、持卡人數據、數據安全、第三方服務提供商、TPSP、內容安全、網頁監控、惡意腳本攻擊 本文為atsec和作者技術共享類文章&#xff0c;旨在共同探討信息安全的相關話題。轉載請注明&#xff…

【gradio】從零搭建知識庫問答系統-Gradio+Ollama+Qwen2.5實現全流程

從零搭建大模型問答系統-GradioOllamaQwen2.5實現全流程&#xff08;一&#xff09; 前言一、界面設計&#xff08;計劃&#xff09;二、模塊設計1.登錄模塊2.注冊模塊3. 主界面模塊4. 歷史記錄模塊 三、相應的接口&#xff08;前后端交互&#xff09;四、實現前端界面的設計co…

案例分享|樹莓派媒體播放器,重構商場廣告的“黃金三秒”

研究顯示&#xff0c;與傳統戶外廣告相比&#xff0c;數字戶外廣告在消費者心中的記憶率提高了17%&#xff0c;而動態戶外廣告更是能提升16%的銷售業績&#xff0c;整體廣告效率提升了17%。這一顯著優勢&#xff0c;使得越來越多資源和技術流入數字廣告行業。 戶外裸眼3D廣告 無…

23種設計模式-裝飾器(Decorator)設計模式

裝飾器設計模式 &#x1f6a9;什么是裝飾器設計模式&#xff1f;&#x1f6a9;裝飾器設計模式的特點&#x1f6a9;裝飾器設計模式的結構&#x1f6a9;裝飾器設計模式的優缺點&#x1f6a9;裝飾器設計模式的Java實現&#x1f6a9;代碼總結&#x1f6a9;總結 &#x1f6a9;什么是…

[Vue]事件修飾符

文章目錄 一、語法介紹二、添加代碼三、結果展示四、參考文獻 如有錯誤&#xff0c;請指正&#xff01;&#xff01;&#xff01; 一、語法介紹 1、問題來源 我們在處理網頁時&#xff0c;當點擊按鈕時會觸發對應事件&#xff0c;但是有時并不想觸發該時間&#xff0c…

Go 語言 sync 包使用教程

Go 語言 sync 包使用教程 Go 語言的 sync 包提供了基本的同步原語&#xff0c;用于在并發編程中協調 goroutine 之間的操作。 1. 互斥鎖 (Mutex) 互斥鎖用于保護共享資源&#xff0c;確保同一時間只有一個 goroutine 可以訪問。 特點&#xff1a; 最基本的同步原語&#x…

ubuntu22.04安裝搜狗輸入法保姆教程~

一、添加中文語言支持 1.首先打開設置,找到Language and Region 2.點擊Manage Installed Languages 3.點擊 Install/Remove Languages... 4.選中Chinese (simplified),點擊Apply

docker中間件部署

1.docker安裝 # 1.卸載舊版本 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 2.需要的安裝包 yum install -y yum-utils# 3.設置鏡像的倉庫 # 3.1.默認是國外的&#x…

python康復日記-request庫的使用,爬蟲自動化測試

一&#xff0c;request的簡單應用 #1請求地址 URLhttps://example.com/login #2參數表單 form_data {username: admin,password: secret } #3返回的響應對象response response requests.post(URL,dataform_data,timeout5 ) #4處理返回結果&#xff0c;這里直接打印返回網頁的…

強化學習和智能決策:Q-Learning和Deep Q-Learning算法

強化學習(Reinforcement Learning, RL)是機器學習的一個重要分支,它通過智能體(Agent)與環境交互來學習最優決策策略,旨在最大化智能體的長期累積獎勵。Q-Learning和Deep Q-Learning是強化學習中的兩種關鍵算法,它們在智能決策領域發揮著重要作用。 一、強化學習基礎 …

ubuntu22.04 安裝Jitsi meet 開源會議系統,代替騰訊會議

0.安裝 官方安裝教程Self-Hosting Guide - Debian/Ubuntu server | Jitsi Meet 一定要用域名訪問&#xff0c; 一定要用域名訪問&#xff0c; 一定要用域名訪問&#xff0c; 一定要用域名訪問&#xff0c; 域名一定要有ssl證書&#xff0c;域名一定要有ssl證書&#xff0c;域名…

專家管理系統(源碼+文檔+講解+演示)

引言 在知識經濟時代&#xff0c;專家管理系統成為了企業優化知識資源、提升決策效率的重要工具。本文將介紹一款創新的專家管理系統&#xff0c;該系統通過智能化工具&#xff0c;助力企業實現專家資源的高效管理和利用。 平臺概述 專家管理系統采用前后端分離的架構設計&a…

css基礎-選擇器

選擇器進階 子串選擇器 /* 匹配 href 以 "https" 開頭的鏈接 */ a[href^"https"] {color: green; }/* 匹配 href 包含 "example" 的鏈接 */ a[href*"example"] {text-decoration: underline; }/* 匹配 href 以 ".pdf" 結尾…

Spring Boot屬性設置方法及優先級完整說明+表格對比

Spring Boot屬性設置方法及優先級完整說明 官網參考&#xff1a; https://docs.spring.io/spring-boot/3.4-SNAPSHOT/reference/features/external-config.html#features.external-config.files 屬性設置方法優先級順序&#xff08;從高到低&#xff09; 命令行參數&#xf…

上門家政小程序實戰,從0到1解決方案

一、邏輯分析 上門家政小程序主要涉及用戶端和服務端兩大部分。用戶端需要實現服務瀏覽、預約下單、訂單跟蹤等功能&#xff1b;服務端則要處理訂單管理、服務人員管理、數據統計等任務。以下是詳細的功能模塊分析&#xff1a; 用戶注冊與登錄&#xff1a;用戶通過手機號或第三…

LLVM學習-DragonEgg工具

2.2.2 使用DragonEgg和LLVM工具了解編譯流程 如果希望看到前端的運行情況&#xff0c;請使用-S -fplugin-arg-dragonegg-emit-ir標志&#xff0c;該標志將產生以LLVM IR代碼表示的人工可讀文件。 一旦編譯器將程序轉換為IR則停止編譯&#xff0c;并將內存中的表示內容寫入磁盤的…

關于cmd中出現無法識別某某指令的問題

今天來解決以下這個比較常見的問題&#xff0c;安裝各種軟件都可能會發生&#xff0c;一般是安裝時沒勾選注冊環境變量&#xff0c;導致cmd無法識別該指令。例如mysql&#xff0c;git等&#xff0c;一般初學者可能不太清楚。 解決這類問題最主要的是了解環境變量的概念&#x…