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

SpringBoot的@Scheduled和@Schedules區(qū)別小結(jié)

 更新時間:2025年01月22日 10:32:23   作者:山高自有客行路  
本文主要介紹了SpringBoot的@Scheduled和@Schedules區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

@Scheduled 的詳細解析

參數(shù)詳解

  • cron: 使用Cron表達式來指定復(fù)雜的調(diào)度模式。Cron表達式的格式如下:

    • 秒(0-59)
    • 分鐘(0-59)
    • 小時(0-23)
    • 日(1-31)
    • 月(1-12 或 JAN-DEC)
    • 星期(0-7 或 SUN-SAT,其中0和7都表示星期日)
    • 年(可選,1970-2099)

    Cron表達式的每個字段可以是具體的值、范圍、列表或通配符(*)。例如:

    • "0 0 12 * * ?" 表示每天中午12點。
    • "0 15 10 ? * MON-FRI" 表示周一至周五上午10:15執(zhí)行。
    • "0 0/5 * * * ?" 表示每5分鐘執(zhí)行一次。
    • "0 0 12 1 * ?" 表示每月第一天中午12點執(zhí)行。
  • fixedRate: 指定以固定的速率重復(fù)執(zhí)行任務(wù),從前一次任務(wù)開始時刻算起。它不會等待前一個任務(wù)完成,因此如果任務(wù)執(zhí)行時間超過了設(shè)定的時間間隔,可能會有重疊的任務(wù)實例在運行。

  • fixedDelay: 類似于 fixedRate,但是它是以前一次任務(wù)的完成時刻作為下一次任務(wù)啟動的時間基準。這種方式可以確保每次只有一個任務(wù)實例在運行,前提是任務(wù)的執(zhí)行時間短于延遲時間。

  • initialDelay: 在第一次執(zhí)行之前等待的時間(毫秒)。這個參數(shù)通常與 fixedRate 或 fixedDelay 一起使用,用來設(shè)置首次執(zhí)行前的延遲。

  • zone: 定義時區(qū),默認是系統(tǒng)的默認時區(qū)。如果你的應(yīng)用需要在全球不同地區(qū)運行,明確指定時區(qū)可能是很重要的。

Cron表達式、fixedRate、fixedDelay、initialDelay如何選擇     

  • 如果你需要非常具體的調(diào)度模式,如每天凌晨兩點執(zhí)行某個任務(wù),那么應(yīng)該選擇Cron表達式。
  • 如果你希望任務(wù)以固定的速率重復(fù)執(zhí)行,不論每次執(zhí)行花費多少時間,你應(yīng)該選擇fixedRate。
  • 如果你希望在前一個任務(wù)完全結(jié)束后再等待一段固定時間才開始下一個任務(wù),那么fixedDelay是更好的選擇。
  • 如果你需要設(shè)置首次執(zhí)行的延遲,可以添加initialDelay參數(shù)到你的調(diào)度配置中。    

示例代碼

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {

    // 每天中午12點執(zhí)行(上海時區(qū))
    @Scheduled(cron = "0 0 12 * * ?", zone = "Asia/Shanghai")
    public void scheduledTaskUsingCron() {
        System.out.println("Scheduled task using cron at Asia/Shanghai timezone.");
    }

    // 每5秒執(zhí)行一次,首次執(zhí)行前等待2秒
    @Scheduled(fixedRate = 5000, initialDelay = 2000)
    public void scheduledTaskWithFixedRate() {
        System.out.println("Scheduled task with fixed rate.");
    }

    // 上次任務(wù)完成后等待3秒再執(zhí)行下一次
    @Scheduled(fixedDelay = 3000)
    public void scheduledTaskWithFixedDelay() {
        System.out.println("Scheduled task with fixed delay.");
    }
}

@Schedules 的詳細解析

@Schedules 允許多個 @Scheduled 注解組合在一起,為同一個方法設(shè)定多種不同的調(diào)度策略。這對于那些需要在多個不同時間點或條件下觸發(fā)的方法非常有用。

示例代碼

import org.springframework.scheduling.annotation.Schedules;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class MultipleScheduledTasks {

    // 每天中午12點執(zhí)行,并且每5秒也執(zhí)行一次
    @Schedules({
        @Scheduled(cron = "0 0 12 * * ?"),
        @Scheduled(fixedRate = 5000)
    })
    public void multipleScheduledTasks() {
        System.out.println("Multiple scheduled tasks.");
    }
}

啟用和管理定時任務(wù)

要使這些注解生效,你需要確保你的Spring應(yīng)用已經(jīng)啟用了對它們的支持。這可以通過在配置類上添加 @EnableScheduling 來實現(xiàn):

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

@Configuration
@EnableScheduling
public class SchedulingConfig {
    // 配置類內(nèi)容
}

自定義 TaskScheduler

對于更復(fù)雜的需求,比如調(diào)整線程池大小或者設(shè)置線程名稱前綴等,你可以通過自定義 TaskScheduler 來進行配置。Spring提供了幾種內(nèi)置的調(diào)度器實現(xiàn),如 ThreadPoolTaskScheduler 和 ConcurrentTaskScheduler。

示例代碼

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

@Configuration
public class SchedulerConfig {

    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(10); // 設(shè)置線程池大小
        taskScheduler.setThreadNamePrefix("MyScheduledTask-");
        taskScheduler.setErrorHandler(t -> {
            System.err.println("Error occurred in scheduled task: " + t.getMessage());
        });
        taskScheduler.setWaitForTasksToCompleteOnShutdown(true);
        taskScheduler.setAwaitTerminationSeconds(60);
        return taskScheduler;
    }
}

錯誤處理

當一個預(yù)定任務(wù)拋出異常時,默認情況下Spring會記錄錯誤日志,但任務(wù)本身不會被取消。如果你想改變這種行為,可以使用 DelegatingErrorHandlingRunnable 或者直接在 ThreadPoolTaskScheduler 中設(shè)置錯誤處理器(如上面的示例所示)。

自定義錯誤處理邏輯

你可以創(chuàng)建自己的錯誤處理器來捕獲并處理異常:

import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

@Configuration
public class AsyncConfig implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(2);
        executor.setMaxPoolSize(5);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("Async-");
        executor.initialize();
        return executor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new SimpleAsyncUncaughtExceptionHandler() {
            @Override
            public void handleUncaughtException(Throwable ex, Method method, Object... params) {
                // 自定義異常處理邏輯
                System.err.println("Exception in async task: " + ex.getMessage());
            }
        };
    }
}

最佳實踐

  • 避免長時間運行的任務(wù):盡量不要讓預(yù)定任務(wù)執(zhí)行過長的時間,因為它們可能會阻塞其他任務(wù)的執(zhí)行。如果任務(wù)有可能運行很長時間,請考慮將其拆分為更小的部分,或者使用異步處理。

  • 任務(wù)沖突管理:當使用 fixedRate 時,要注意任務(wù)可能會重疊。如果任務(wù)執(zhí)行時間可能超過間隔時間,應(yīng)該選擇 fixedDelay 來避免這種情況。

  • 資源清理:確保在任務(wù)結(jié)束時正確釋放任何獲取的資源,比如數(shù)據(jù)庫連接或文件句柄。

  • 監(jiān)控和報警:建立適當?shù)谋O(jiān)控和報警機制,以便在任務(wù)失敗時能夠及時收到通知并采取行動??梢岳肧pring Boot Actuator提供的健康檢查端點,或者集成第三方監(jiān)控工具如Prometheus、Grafana等。

  • 冪等性設(shè)計:確保任務(wù)邏輯具有冪等性,即多次執(zhí)行相同的任務(wù)不會導致不一致的結(jié)果。這在分布式環(huán)境中尤為重要。

  • 日志記錄:為每個任務(wù)添加詳細的日志記錄,包括任務(wù)開始時間和結(jié)束時間,以便追蹤任務(wù)執(zhí)行情況。

  • 測試:編寫單元測試和集成測試來驗證定時任務(wù)的行為是否符合預(yù)期??梢允褂肕ockito或其他測試框架模擬依賴服務(wù)。

  • 多實例部署的問題:在多實例部署的情況下,所有的實例都會嘗試執(zhí)行相同的定時任務(wù),這可能導致數(shù)據(jù)競爭或重復(fù)執(zhí)行。一種解決方案是使用分布式鎖,如Redisson提供的RedLock,來保證同一時間只有一個實例執(zhí)行特定的任務(wù)。

  • 性能優(yōu)化:對于高并發(fā)場景下的定時任務(wù),應(yīng)該評估線程池的大小和任務(wù)的執(zhí)行頻率,避免因過多的任務(wù)同時啟動而導致資源耗盡??梢酝ㄟ^限流、隊列管理和異步處理等方式提高系統(tǒng)的穩(wěn)定性和響應(yīng)速度。

處理定時任務(wù)中的常見問題

  • 任務(wù)未按預(yù)期執(zhí)行:檢查日志以確定是否有任何異?;蝈e誤信息。確保任務(wù)方法是非靜態(tài)的,并且沒有被final修飾。確認 @EnableScheduling 已經(jīng)正確啟用。另外,檢查是否存在其他因素阻止任務(wù)執(zhí)行,如網(wǎng)絡(luò)延遲或依賴服務(wù)不可用。

  • 任務(wù)執(zhí)行順序混亂:如果你有多個任務(wù)幾乎同時執(zhí)行,可能會出現(xiàn)執(zhí)行順序混亂的情況。確保你理解了 fixedRate 和 fixedDelay 的區(qū)別,并根據(jù)需要選擇合適的方式。此外,可以通過增加任務(wù)之間的最小間隔時間來減少沖突的可能性。

  • 多實例部署的問題:在多實例部署的情況下,所有實例都會嘗試執(zhí)行相同的定時任務(wù)。為了解決這個問題,可以引入分布式鎖機制,如基于Redis的鎖或Zookeeper的臨時節(jié)點,以確保同一時間只有一個實例執(zhí)行任務(wù)。

  • 長時間運行的任務(wù):盡量不要讓預(yù)定任務(wù)執(zhí)行過長的時間,因為它們可能會阻塞其他任務(wù)的執(zhí)行。如果任務(wù)有可能運行很長時間,請考慮將其拆分為更小的部分,或者使用異步處理,如通過消息隊列(MQ)來分發(fā)任務(wù)。

  • 時區(qū)問題:確保你的應(yīng)用程序正確處理時區(qū)差異,特別是在全球范圍內(nèi)運行時??梢栽?nbsp;@Scheduled 注解中顯式指定 zone 參數(shù),或者在整個應(yīng)用程序中統(tǒng)一配置默認時區(qū)。

案例分析

假設(shè)你正在開發(fā)一個電子商務(wù)平臺,需要每天凌晨2點生成前一天的銷售報告。你可以使用 @Scheduled 注解來安排這個任務(wù):

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

@Service
public class DailyReportService {

    @Scheduled(cron = "0 0 2 * * ?", zone = "Asia/Shanghai")
    public void generateDailySalesReport() {
        // 執(zhí)行生成銷售報告的邏輯
        System.out.println("Generating daily sales report at Asia/Shanghai timezone.");
    }
}

此外,你還可以結(jié)合上述的最佳實踐來增強任務(wù)的可靠性,例如:

  • 確保任務(wù)具有冪等性,即使由于某種原因任務(wù)重復(fù)執(zhí)行也不會影響結(jié)果。
  • 添加詳細的日志記錄,幫助追蹤任務(wù)的執(zhí)行情況。
  • 實現(xiàn)錯誤處理邏輯,確保即使發(fā)生異常也能得到妥善處理。
  • 如果平臺有多實例部署,考慮使用分布式鎖來防止多個實例同時生成報告。

 到此這篇關(guān)于SpringBoot的@Scheduled和@Schedules區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)SpringBoot @Scheduled和@Schedules內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC中使用bean來接收form表單提交的參數(shù)時的注意點

    SpringMVC中使用bean來接收form表單提交的參數(shù)時的注意點

    本篇文章主要介紹了SpringMVC中使用bean來接收form表單提交的參數(shù)時的注意點,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-05-05
  • Springboot微服務(wù)打包Docker鏡像流程解析

    Springboot微服務(wù)打包Docker鏡像流程解析

    這篇文章主要介紹了Springboot微服務(wù)打包Docker鏡像流程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • 解決IDEA中maven導入jar包一直報錯問題

    解決IDEA中maven導入jar包一直報錯問題

    這篇文章主要介紹了解決IDEA中maven導入jar包一直報錯問題,本文通過實例圖文的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • 關(guān)于JSONObject.toJSONString出現(xiàn)地址引用問題

    關(guān)于JSONObject.toJSONString出現(xiàn)地址引用問題

    這篇文章主要介紹了關(guān)于JSONObject.toJSONString出現(xiàn)地址引用問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringMVC文件上傳請求問題分析

    SpringMVC文件上傳請求問題分析

    這篇文章主要介紹了SpringMVC文件上傳請求,我們發(fā)的請求默認都是由DispatcherServlet類的doDispatch()來處理,這個方法的邏輯處理的第一步就是處理文件上傳的請求,我們一起來看看是怎么處理的吧
    2024-07-07
  • 使用Swagger直接上傳文件的方法

    使用Swagger直接上傳文件的方法

    這篇文章主要介紹了使用Swagger直接上傳文件的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Jenkins自動部署Net Core過程圖解

    Jenkins自動部署Net Core過程圖解

    這篇文章主要介紹了Jenkins自動部署Net Core過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • 五分鐘帶你快速學習Spring?IOC

    五分鐘帶你快速學習Spring?IOC

    這篇文章主要給大家介紹了關(guān)于如何通過五分鐘快速學習Spring?IOC的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-03-03
  • SpringBoot路徑映射配置的實現(xiàn)步驟

    SpringBoot路徑映射配置的實現(xiàn)步驟

    本文介紹了如何在SpringBoot項目中配置路徑映射,使得除static目錄外的資源可被訪問,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-08-08
  • SpringBoot中Mybatis + Druid 數(shù)據(jù)訪問的詳細過程

    SpringBoot中Mybatis + Druid 數(shù)據(jù)訪問的詳細過程

    Spring Boot 底層都是采用 SpringData 的方式進行統(tǒng)一處理各種數(shù)據(jù)庫,SpringData也是Spring中與SpringBoot、SpringCloud 等齊名的知名項目,下面看下SpringBoot Mybatis Druid數(shù)據(jù)訪問的詳細過程,感興趣的朋友一起看看吧
    2021-11-11

最新評論

航空| 曲沃县| 上饶县| 四子王旗| 岚皋县| 泰安市| 江阴市| 嘉义市| 织金县| 徐水县| 紫阳县| 大埔区| 霞浦县| 汉源县| 南城县| 嘉义市| 略阳县| 兴义市| 台北市| 教育| 阳城县| 西城区| 冀州市| 迁安市| 鄂托克旗| 合作市| 稷山县| 克拉玛依市| 徐汇区| 阿拉善右旗| 微山县| 朔州市| 江达县| 滕州市| 武邑县| 安塞县| 阳春市| 四川省| 神池县| 景洪市| 濉溪县|