最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java定時任務(wù)Schedule的基本用法及Cron表達(dá)式實踐記錄

 更新時間:2026年01月21日 09:52:07   作者:三金12138  
本文介紹了Spring框架提供的@Scheduled注解和cron表達(dá)式在Java定時任務(wù)中的應(yīng)用,詳細(xì)講解了基礎(chǔ)配置、Cron表達(dá)式解析以及進(jìn)階用法和注意事項,感興趣的朋友跟隨小編一起看看吧

在日常Java開發(fā)中,定時任務(wù)是高頻需求場景,比如定時同步數(shù)據(jù)、定時清理日志、定時發(fā)送通知等。Spring框架提供的@Scheduled注解簡化了定時任務(wù)的開發(fā),無需依賴外部調(diào)度框架(如Quartz),就能快速實現(xiàn)輕量級定時任務(wù)。而cron表達(dá)式作為Schedule中靈活度最高的觸發(fā)規(guī)則配置方式,是掌握該功能的核心。本文將從Schedule的基礎(chǔ)用法入手,深入解析cron表達(dá)式,并結(jié)合實例演示其在項目中的應(yīng)用。

一、Spring Schedule基礎(chǔ)配置

要使用Spring Schedule,首先需要完成基礎(chǔ)配置,整體步驟簡單易懂,適用于Spring Boot項目和傳統(tǒng)Spring項目。

1.1 依賴引入(Spring Boot)

Spring Boot項目無需額外引入依賴,spring-boot-starter中已包含Schedule相關(guān)組件,只需確保pom.xml(Maven)中存在核心依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

1.2 開啟定時任務(wù)支持

在Spring Boot啟動類上添加@EnableScheduling注解,開啟定時任務(wù)調(diào)度功能:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling // 開啟定時任務(wù)
public class ScheduleDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(ScheduleDemoApplication.class, args);
    }
}

1.3 基礎(chǔ)定時任務(wù)實現(xiàn)

通過@Scheduled注解標(biāo)記方法為定時任務(wù),支持多種觸發(fā)規(guī)則,常見的有固定延遲、固定頻率和cron表達(dá)式三種方式。其中cron表達(dá)式適用于復(fù)雜的時間規(guī)則配置,也是本文重點。

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component // 交給Spring管理
public class ScheduleTask {
    // 固定延遲:上一次任務(wù)執(zhí)行完畢后延遲1秒執(zhí)行下一次
    @Scheduled(fixedDelay = 1000)
    public void fixedDelayTask() {
        System.out.println("固定延遲任務(wù)執(zhí)行:" + System.currentTimeMillis());
    }
    // 固定頻率:每隔1秒執(zhí)行一次(無論上一次是否完成)
    @Scheduled(fixedRate = 1000)
    public void fixedRateTask() {
        System.out.println("固定頻率任務(wù)執(zhí)行:" + System.currentTimeMillis());
    }
    // cron表達(dá)式:每天凌晨2點執(zhí)行
    @Scheduled(cron = "0 0 2 * * ?")
    public void cronTask() {
        System.out.println("Cron任務(wù)執(zhí)行:" + System.currentTimeMillis());
    }
}

二、Cron表達(dá)式深度解析

Cron表達(dá)式是一種時間表達(dá)式,用于定義復(fù)雜的定時規(guī)則,起源于Unix系統(tǒng),后被廣泛應(yīng)用于各類調(diào)度框架。在Spring Schedule中,cron表達(dá)式支持6個或7個字段,字段之間用空格分隔,語法格式如下:

2.1 表達(dá)式格式

Spring Schedule中的cron表達(dá)式格式(7個字段,最后一個年份字段可選):

秒 分 時 日 月 周 年(可選

各字段的取值范圍及允許的特殊字符如下表所示:

字段

取值范圍

允許的特殊字符

說明

0-59

, - * /

每秒用*表示,每5秒用0/5表示

0-59

, - * /

每分用*表示,每10分用0/10表示

0-23

, - * /

每天凌晨2點用2表示,每6小時用0/6表示

1-31

, - * / ? L W C

?表示不指定值,避免日和周沖突;L表示當(dāng)月最后一天

1-12 或 JAN-DEC

, - * /

1表示1月,JAN也可表示1月

1-7 或 SUN-SAT

, - * / ? L C #

1表示周日,7表示周六;#表示第幾個周幾,如6#3表示當(dāng)月第3個周五

年(可選)

1970-2099

, - * /

省略時表示所有年份

2.2 特殊字符含義

cron表達(dá)式的靈活度依賴于特殊字符的使用,核心特殊字符的含義如下:

  • *:表示匹配該字段的所有值。例如,時字段為*,表示每小時都觸發(fā)。
  • ?:僅用于日和周字段,標(biāo)識不指定具體值,避免兩個字段沖突。例如,要指定每月10號觸發(fā),周字段需設(shè)為?
  • /:表示遞增觸發(fā)。格式為“起始值/步長”,例如,秒字段為0/5,表示從0秒開始,每5秒觸發(fā)一次。
  • -:表示區(qū)間。例如,時字段為9-17,表示上午9點到下午5點之間,每小時觸發(fā)一次。
  • ,:表示多個值。例如,分字段為10,20,30,表示每小時的10分、20分、30分各觸發(fā)一次。
  • L:僅用于日和周字段,標(biāo)識最后一個。例如,日字段為L,表示當(dāng)月最后一天;周字段為L,表示當(dāng)月最后一個周六。
  • #:僅用于周字段,標(biāo)識第幾個周幾。格式為“周幾#第幾個”,例如,周字段為6#3,表示當(dāng)月第3個周五(6表示周五)。

2.3 常用Cron表達(dá)式示例

結(jié)合實際業(yè)務(wù)場景,整理以下常用cron表達(dá)式,可直接套用:

  • 0 0 2 * * ?:每天凌晨2點執(zhí)行
  • 0 30 8 * * ?:每天早上8點30分執(zhí)行
  • 0 0/10 * * * ?:每10分鐘執(zhí)行一次
  • 0 0 9-18 * * ?:每天上午9點到下午6點,每小時執(zhí)行一次
  • 0 0 12 ? * SAT:每周六中午12點執(zhí)行
  • 0 0 0 L * ?:每月最后一天凌晨0點執(zhí)行
  • 0 0 0 1 * ?:每月1號凌晨0點執(zhí)行
  • 0 0 0 ? * 6#1:每月第一個周五凌晨0點執(zhí)行
  • 0/5 * * * * ?:每5秒執(zhí)行一次(用于測試)

三、Schedule進(jìn)階用法與注意事項

3.1 異步定時任務(wù)

默認(rèn)情況下,Spring Schedule的定時任務(wù)是同步執(zhí)行的,即多個任務(wù)會在同一個線程中按順序執(zhí)行,若某個任務(wù)執(zhí)行時間過長,會阻塞其他任務(wù)。如需異步執(zhí)行,可通過@EnableAsync@Async注解實現(xiàn):

// 1. 啟動類添加@EnableAsync開啟異步支持
@SpringBootApplication
@EnableScheduling
@EnableAsync
public class ScheduleDemoApplication { ... }
// 2. 定時任務(wù)方法添加@Async注解
@Component
public class ScheduleTask {
    @Async
    @Scheduled(cron = "0/5 * * * * ?")
    public void asyncCronTask() {
        System.out.println("異步Cron任務(wù)執(zhí)行:" + Thread.currentThread().getName());
    }
}

3.2 動態(tài)調(diào)整Cron表達(dá)式

靜態(tài)cron表達(dá)式在項目啟動后無法修改,若需動態(tài)調(diào)整觸發(fā)規(guī)則,可通過實現(xiàn)SchedulingConfigurer接口自定義調(diào)度配置,從數(shù)據(jù)庫或配置中心讀取cron表達(dá)式:

import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
@Component
public class DynamicCronTask implements SchedulingConfigurer {
    // 模擬從數(shù)據(jù)庫獲取cron表達(dá)式(實際項目中可對接DB或Nacos)
    private String cron = "0/5 * * * * ?";
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        // 注冊定時任務(wù)
        taskRegistrar.addTriggerTask(
                this::dynamicTaskExecute, // 任務(wù)執(zhí)行邏輯
                triggerContext -> {
                    // 每次觸發(fā)前重新獲取cron表達(dá)式(實現(xiàn)動態(tài)更新)
                    CronTrigger trigger = new CronTrigger(getCron());
                    return trigger.nextExecutionTime(triggerContext);
                }
        );
    }
    public void dynamicTaskExecute() {
        System.out.println("動態(tài)Cron任務(wù)執(zhí)行:" + System.currentTimeMillis());
    }
    // 獲取最新cron表達(dá)式(可擴展為從數(shù)據(jù)庫查詢)
    public String getCron() {
        return this.cron;
    }
    // 更新cron表達(dá)式
    public void setCron(String cron) {
        this.cron = cron;
    }
}

3.3 核心注意事項

  • 日和周字段沖突:日和周字段不能同時指定具體值,需有一個設(shè)為?,否則會導(dǎo)致任務(wù)觸發(fā)規(guī)則異常。例如,要指定每月10號執(zhí)行,周字段必須設(shè)為?,表達(dá)式為0 0 0 10 * ?。
  • 任務(wù)執(zhí)行時長:同步任務(wù)中,若任務(wù)執(zhí)行時長超過觸發(fā)間隔,下一次任務(wù)會等待上一次完成后再執(zhí)行;異步任務(wù)無此限制,但需注意并發(fā)問題。
  • 時區(qū)問題:Spring Schedule默認(rèn)使用服務(wù)器時區(qū),若需指定時區(qū),可在@Scheduled注解中設(shè)置zone屬性,例如zone = "GMT+8"。
  • 避免耗時操作:定時任務(wù)中應(yīng)避免執(zhí)行耗時過長的操作,建議將耗時邏輯異步處理,或拆分任務(wù),防止阻塞調(diào)度線程。

到此這篇關(guān)于Java定時任務(wù)Schedule的基本用法及Cron表達(dá)式實踐的文章就介紹到這了,更多相關(guān)Java Schedule用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java覆蓋第三方j(luò)ar包中的某一個類的實現(xiàn)方法

    Java覆蓋第三方j(luò)ar包中的某一個類的實現(xiàn)方法

    在我們?nèi)粘5拈_發(fā)中,經(jīng)常需要使用第三方的 jar 包,有時候我們會發(fā)現(xiàn)第三方的 jar 包中的某一個類有問題,或者我們需要定制化修改其中的邏輯,那么應(yīng)該如何實現(xiàn)呢,本文給大家介紹了Java覆蓋第三方j(luò)ar包中的某一個類的實現(xiàn)方法,需要的朋友可以參考下
    2025-02-02
  • SpringBoot實現(xiàn)過濾敏感詞的示例代碼

    SpringBoot實現(xiàn)過濾敏感詞的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用SpringBoot實現(xiàn)過濾敏感詞功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動手嘗試一下
    2022-08-08
  • Java ForkJoin框架的原理及用法

    Java ForkJoin框架的原理及用法

    這篇文章主要介紹了Java ForkJoin框架的原理及用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • 手寫java性能測試框架的實現(xiàn)示例

    手寫java性能測試框架的實現(xiàn)示例

    這篇文章主要為大家介紹了java實現(xiàn)性能測試框架示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 基于spring同名bean覆蓋問題的解決

    基于spring同名bean覆蓋問題的解決

    這篇文章主要介紹了spring同名bean覆蓋問題的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java獲取客戶端真實IP地址經(jīng)典寫法詳解

    Java獲取客戶端真實IP地址經(jīng)典寫法詳解

    在Web開發(fā)中,獲取客戶端的真實IP地址是一個常見需求,本文將分別給出經(jīng)典寫法(基于工具類/條件判斷)和Lambda寫法(基于函數(shù)式接口?+?流式處理)的實現(xiàn),并進(jìn)行對比
    2026-04-04
  • Java11中基于嵌套關(guān)系的訪問控制優(yōu)化詳解

    Java11中基于嵌套關(guān)系的訪問控制優(yōu)化詳解

    Java(和其他語言)通過內(nèi)部類支持嵌套類,要使其正常工作,需要編譯器執(zhí)行一些技巧,下面這篇文章主要給大家介紹了關(guān)于Java11中基于嵌套關(guān)系的訪問控制優(yōu)化的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • SpringBoot實現(xiàn)熱部署Community的示例代碼

    SpringBoot實現(xiàn)熱部署Community的示例代碼

    本文主要介紹了SpringBoot實現(xiàn)熱部署Community的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • SpringAOP中的Advisor詳解

    SpringAOP中的Advisor詳解

    這篇文章主要介紹了SpringAOP中的Advisor詳解,平時我們項目中涉及到?AOP,基本上就是聲明式配置一下就行了,無論是基于?XML?的配置還是基于?Java?代碼的配置,都是簡單配置即可使用,今天就來看一下聲明式配置的使用,需要的朋友可以參考下
    2023-08-08
  • Spring Boot Swagger2使用方法過程解析

    Spring Boot Swagger2使用方法過程解析

    這篇文章主要介紹了Spring Boot Swagger2使用方法過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08

最新評論

高邮市| 兴文县| 鹤峰县| 铅山县| 山西省| 南投县| 正镶白旗| 峨山| 三江| 读书| 济宁市| 泗水县| 徐州市| 昌都县| 余江县| 保康县| 城固县| 泗阳县| 富平县| 迭部县| 濮阳县| 永州市| 寿宁县| 如皋市| 德阳市| 南宁市| 沈阳市| 门源| 漯河市| 通州区| 井研县| 奉贤区| 抚州市| 景洪市| 紫云| 淮南市| 应城市| 玉溪市| 乡城县| 太湖县| 客服|