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

SpringBoot中使用異步調(diào)度程序的高級(jí)方法

 更新時(shí)間:2024年07月04日 09:45:24   作者:Eddie_920  
本文主要介紹了SpringBoot中使用異步調(diào)度程序的高級(jí)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

案例:

有兩個(gè)調(diào)度器,一個(gè)調(diào)度器每3分鐘運(yùn)行一次從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù),另一個(gè)調(diào)度器每分鐘運(yùn)行一次調(diào)用REST API。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
public class YourSpringBootApplication {

    public static void main(String[] args) {
        SpringApplication.run(YourSpringBootApplication.class, args);
    }
}

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

@Component
public class FirstScheduler {

    @Scheduled(fixedRate = 3 * 60 * 1000) // 每3分鐘運(yùn)行一次
    public void getDataFromDB() {
        // 從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)的代碼
    }
}

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

@Component
public class SecondScheduler {

    @Scheduled(fixedRate = 1 * 60 * 1000) // 每1分鐘運(yùn)行一次
    public void consumeRestApi() {
        // 調(diào)用REST API的代碼
    }
}

問(wèn)題:

當(dāng)?shù)谝粋€(gè)調(diào)度器運(yùn)行時(shí)間超過(guò)預(yù)期時(shí)間,例如執(zhí)行了10分鐘,那么第二個(gè)調(diào)度器則不會(huì)運(yùn)行,一直到第一個(gè)調(diào)度器運(yùn)行結(jié)束后。

上述代碼存在的問(wèn)題,當(dāng)一個(gè)調(diào)度器運(yùn)行時(shí),第二個(gè)調(diào)度器會(huì)被阻塞。

解決方案:

為了避免第二個(gè)調(diào)度器因第一個(gè)調(diào)度器而被阻塞,可以使用Spring的異步執(zhí)行。這樣做每個(gè)調(diào)度器都將在自己?jiǎn)为?dú)線程中運(yùn)行從而實(shí)現(xiàn)獨(dú)立工作。

實(shí)現(xiàn)代碼:

在使用Spring的異步執(zhí)行支持時(shí),最佳做法是配置一個(gè)自定義線程池來(lái)控制異步任務(wù)執(zhí)行所用的線程數(shù)量。默認(rèn)情況下Spring使用SimpleAsyncTaskExecutor(這在生產(chǎn)環(huán)境中可能不太合適,因?yàn)樗惶峁└鄬?duì)線程池的控制方法。)
為了解決這個(gè)問(wèn)題建議在應(yīng)用程序中創(chuàng)建一個(gè)自定義線程池bean。以下是實(shí)現(xiàn)代碼:

步驟1:定義一個(gè)配置類創(chuàng)建自定義線程池bean。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration
@EnableAsync
public class AsyncConfiguration {

    @Bean(name = "asyncTaskExecutor")
    public ThreadPoolTaskExecutor asyncTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5); // 設(shè)置線程池中的初始線程數(shù)
        executor.setMaxPoolSize(10); // 設(shè)置線程池中的最大線程數(shù)
        executor.setQueueCapacity(25); // 設(shè)置用于保存掛起任務(wù)的隊(duì)列容量
        executor.setThreadNamePrefix("AsyncTask-"); // 設(shè)置線程名前綴
        executor.initialize();
        return executor;
    }
}

步驟2:修改第一個(gè)調(diào)度器,使其使用此自定義線程池。

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

@Component
public class FirstScheduler {

    @Async("asyncTaskExecutor") // 指定自定義線程池bean名稱
    @Scheduled(fixedRate = 3 * 60 * 1000) // 每3分鐘運(yùn)行一次
    public void getDataFromDB() {
        // 從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)的代碼
        // 此方法將在自定義線程池中異步運(yùn)行
    }
}

通過(guò)這種配置,第一個(gè)調(diào)度器方法(getDataFromDB)將在自定義線程池中異步運(yùn)行,而第二個(gè)調(diào)度器方法(consumeRestApi)則在默認(rèn)調(diào)度器的線程中運(yùn)行。

根據(jù)應(yīng)用程序需求和可用系統(tǒng)資源調(diào)整corePoolSize、maxPoolSize和queueCapacity值。線程池配置對(duì)應(yīng)用程序的性能產(chǎn)生比較重要的影響,因此需要適當(dāng)調(diào)整這些值。

要使第二個(gè)調(diào)度器也使用自定義線程池進(jìn)行異步執(zhí)行,需要在consumeRestApi方法的@Async注解中添加taskExecutor屬性。這樣確保兩個(gè)調(diào)度器都在相同的自定義線程池中異步運(yùn)行。以下是更新后的代碼:

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

@Component
public class SecondScheduler {

    @Async("asyncTaskExecutor") // 指定自定義線程池bean名稱
    @Scheduled(fixedRate = 1 * 60 * 1000) // 每1分鐘運(yùn)行一次
    public void consumeRestApi() {
        // 調(diào)用REST API的代碼
        // 此方法將在自定義線程池中異步運(yùn)行
    }
}

通過(guò)這種設(shè)置,第一個(gè)調(diào)度器(getDataFromDB)和第二個(gè)調(diào)度器(consumeRestApi)都將在相同的自定義線程池中異步運(yùn)行。這將允許它們獨(dú)立地工作,即使其中一個(gè)任務(wù)需要更長(zhǎng)時(shí)間來(lái)完成。

使用自定義線程池
記錄錯(cuò)誤消息,當(dāng)所需線程池大小 > 配置的線程池大小時(shí):
要在所需線程池大小超過(guò)配置的線程池大小時(shí)記錄錯(cuò)誤消息,可以利用Spring的ThreadPoolTaskExecutor的RejectedExecutionHandler。當(dāng)線程池的任務(wù)隊(duì)列已滿且線程池?zé)o法接受更多任務(wù)時(shí),將調(diào)用此處理程序。可以使用此回調(diào)來(lái)記錄錯(cuò)誤消息。

以下是更新的配置類,其中包含RejectedExecutionHandler:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

@Configuration
@EnableAsync
@Sl4J
public class AsyncConfiguration {

    @Bean(name = "asyncTaskExecutor")
    public ThreadPoolTaskExecutor asyncTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5); // 設(shè)置線程池中的初始線程數(shù)
        executor.setMaxPoolSize(10); // 設(shè)置線程池中的最大線程數(shù)
        executor.setQueueCapacity(25); // 設(shè)置用于保存掛起任務(wù)的隊(duì)列容量
        executor.setThreadNamePrefix("AsyncTask-"); // 設(shè)置線程名前綴

        // 設(shè)置RejectedExecutionHandler以記錄錯(cuò)誤消息
        executor.setRejectedExecutionHandler((Runnable r, ThreadPoolExecutor e) -> {
            // 記錄錯(cuò)誤消息,隊(duì)列已滿,任務(wù)被拒絕
            // 根據(jù)需要自定義此消息
            log.error("任務(wù)被拒絕:線程池已滿。請(qǐng)?jiān)黾泳€程池大小。");
        });

        executor.initialize();
        return executor;
    }
}

通過(guò)這種配置,當(dāng)線程池的隊(duì)列已滿且嘗試提交額外任務(wù)時(shí),RejectedExecutionHandler會(huì)被觸發(fā)。
你可以根據(jù)應(yīng)用程序的需求自定義錯(cuò)誤消息或采取其他操作。

請(qǐng)注意,設(shè)置正確的線程池大小和隊(duì)列容量對(duì)于應(yīng)用程序的性能和資源利用率至關(guān)重要。

如果因?yàn)殛?duì)列容量不足而任務(wù)持續(xù)被拒絕則需要增加線程池大小或調(diào)整隊(duì)列容量。

總結(jié):

通過(guò)配置共享的自定義線程池、利用@Async注解以及整合RejectedExecutionHandler,可以使應(yīng)用程序有效地管理和執(zhí)行多個(gè)調(diào)度器并發(fā)從而確保調(diào)度器獨(dú)立運(yùn)行,并且系統(tǒng)能夠優(yōu)雅地響應(yīng)線程池限制。

到此這篇關(guān)于SpringBoot中使用異步調(diào)度程序的高級(jí)方法的文章就介紹到這了,更多相關(guān)SpringBoot 異步調(diào)度內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)讀取Excel文件功能(EasyExcel初使用)

    Java實(shí)現(xiàn)讀取Excel文件功能(EasyExcel初使用)

    EasyExcel是一款基于Java語(yǔ)言的開(kāi)源Excel解析工具,可以幫助我們快速、高效地讀取和寫入Excel文件,這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)讀取Excel文件功能的相關(guān)資料,使用的是EasyExcel,需要的朋友可以參考下
    2024-07-07
  • Spring Boot配置動(dòng)態(tài)更新問(wèn)題

    Spring Boot配置動(dòng)態(tài)更新問(wèn)題

    這篇文章主要介紹了Spring Boot配置動(dòng)態(tài)更新問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • SpringBoot使用DevTools實(shí)現(xiàn)后端熱部署的過(guò)程詳解

    SpringBoot使用DevTools實(shí)現(xiàn)后端熱部署的過(guò)程詳解

    在Spring Boot項(xiàng)目中,Spring Boot官方提供你了Devtools熱部署模塊,通過(guò)maven的方式導(dǎo)入就能使用,本文主要SpringBoot通過(guò)DevTools實(shí)現(xiàn)熱部署,感興趣的朋友一起看看吧
    2023-11-11
  • 圖解Java經(jīng)典算法插入排序的原理與實(shí)現(xiàn)

    圖解Java經(jīng)典算法插入排序的原理與實(shí)現(xiàn)

    插入排序的算法描述是一種簡(jiǎn)單直觀的排序算法。其原理是通過(guò)構(gòu)建有序序列,對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。本文將用Java語(yǔ)言實(shí)現(xiàn)插入排序算法并進(jìn)行可視化,感興趣的可以了解一下
    2022-09-09
  • 關(guān)于postman傳參的幾種格式 list,map 等

    關(guān)于postman傳參的幾種格式 list,map 等

    這篇文章主要介紹了postman傳參的幾種格式 list,map等,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring mvc如何實(shí)現(xiàn)數(shù)據(jù)處理

    Spring mvc如何實(shí)現(xiàn)數(shù)據(jù)處理

    這篇文章主要介紹了Spring mvc如何實(shí)現(xiàn)數(shù)據(jù)處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java中減少if-else的設(shè)計(jì)模式和優(yōu)化技巧

    Java中減少if-else的設(shè)計(jì)模式和優(yōu)化技巧

    “過(guò)于依賴 if-else 不僅會(huì)讓代碼變得臃腫不堪,還會(huì)使維護(hù)成本大大增加,其實(shí),if-else 雖然是最基礎(chǔ)的條件分支,但它并不是萬(wàn)能的解決方案,今天,我將帶大家了解一些取代 if-else 的設(shè)計(jì)模式和優(yōu)化技巧,需要的朋友可以參考下
    2025-04-04
  • Java 多線程與并發(fā)編程全面實(shí)戰(zhàn)指南

    Java 多線程與并發(fā)編程全面實(shí)戰(zhàn)指南

    本文系統(tǒng)講解Java多線程與并發(fā)編程,涵蓋線程創(chuàng)建、同步機(jī)制(synchronized/Lock)、通信工具、并發(fā)集合、線程池及CompletableFuture等現(xiàn)代技術(shù),強(qiáng)調(diào)正確使用多線程的重要性,提供避免死鎖、內(nèi)存可見(jiàn)性等常見(jiàn)問(wèn)題的實(shí)踐指南,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • mybatisPlus中批量刪除的示例代碼

    mybatisPlus中批量刪除的示例代碼

    本文主要介紹了mybatisPlus中批量刪除的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Intellij IDEA 2018配置Java運(yùn)行環(huán)境的方法步驟

    Intellij IDEA 2018配置Java運(yùn)行環(huán)境的方法步驟

    這篇文章主要介紹了Intellij IDEA 2018配置Java運(yùn)行環(huán)境的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09

最新評(píng)論

桦甸市| 汾阳市| 洪洞县| 高陵县| 敦煌市| 姚安县| 平度市| 南岸区| 舒兰市| 阿瓦提县| 阿拉善盟| 司法| 子长县| 阿合奇县| 琼海市| 乾安县| 墨竹工卡县| 湘潭市| 马边| 抚州市| 江山市| 赤城县| 独山县| 梨树县| 永州市| 巧家县| 离岛区| 涞源县| 广平县| 克什克腾旗| 八宿县| 临汾市| 深州市| 彰化市| 玉屏| 昌江| 大城县| 霍州市| 绥德县| 镇安县| 祁东县|