欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Nacos配合SpringBoot實(shí)現(xiàn)動(dòng)態(tài)線程池的基本步驟

 更新時(shí)間:2024年02月02日 08:32:45   作者:一只愛(ài)擼貓的程序猿  
使用Nacos配合Spring Boot實(shí)現(xiàn)動(dòng)態(tài)線程池,可以讓你的應(yīng)用動(dòng)態(tài)地調(diào)整線程池參數(shù)而無(wú)需重啟,這對(duì)于需要高度可配置且需要適應(yīng)不同負(fù)載情況的應(yīng)用來(lái)說(shuō)非常有用,本文給大家介紹實(shí)現(xiàn)動(dòng)態(tài)線程池的基本步驟,需要的朋友可以參考下

引入依賴(lài):

首先,確保你的Spring Boot應(yīng)用已經(jīng)添加了Nacos的依賴(lài)。你需要引入Nacos Config Starter來(lái)實(shí)現(xiàn)配置的動(dòng)態(tài)更新。

pom.xml中添加如下依賴(lài):

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

配置Nacos:

在你的application.propertiesapplication.yml中配置Nacos的服務(wù)地址和命名空間,以及其他相關(guān)配置。

例如,在application.yml中添加:

spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 # Nacos服務(wù)地址
        namespace: your-namespace # Nacos命名空間
        file-extension: yaml # 配置文件類(lèi)型

定義線程池:

在Spring Boot應(yīng)用中定義一個(gè)線程池??梢允褂?code>ThreadPoolTaskExecutor來(lái)創(chuàng)建一個(gè)可配置的線程池。

@Configuration
public class ThreadPoolConfig {

    @Value("${thread.pool.core-size}")
    private int coreSize;

    @Value("${thread.pool.max-size}")
    private int maxSize;

    @Value("${thread.pool.queue-capacity}")
    private int queueCapacity;

    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(coreSize);
        executor.setMaxPoolSize(maxSize);
        executor.setQueueCapacity(queueCapacity);
        executor.initialize();
        return executor;
    }
}

在Nacos中配置線程池參數(shù):

在Nacos的配置列表中添加一個(gè)新的配置文件,文件內(nèi)容包含線程池的配置參數(shù),例如thread.pool.core-size、thread.pool.max-sizethread.pool.queue-capacity的值。

thread:
  pool:
    core-size: 10
    max-size: 20
    queue-capacity: 100

動(dòng)態(tài)刷新配置:

通過(guò)@RefreshScope或Nacos的動(dòng)態(tài)配置監(jiān)聽(tīng)功能,實(shí)現(xiàn)配置的動(dòng)態(tài)刷新。這樣,當(dāng)你在Nacos中更新了線程池配置后,應(yīng)用會(huì)自動(dòng)讀取新的配置值并應(yīng)用到線程池中,而無(wú)需重啟服務(wù)。

如果使用@RefreshScope,可以在定義線程池的Bean上加上@RefreshScope注解,或者在配置值注入的地方使用@RefreshScope來(lái)確保配置更新時(shí)能夠重新加載。

注意事項(xiàng)

  • 確保Nacos配置中心的Data ID與應(yīng)用的配置文件名稱(chēng)相匹配,格式通常為${spring.application.name}.properties${spring.application.name}.yaml
  • 使用@RefreshScope注解會(huì)增加一定的運(yùn)行時(shí)開(kāi)銷(xiāo),因?yàn)槊看闻渲酶聲r(shí),Spring都需要重新創(chuàng)建標(biāo)記了該注解的bean。因此,建議僅在必要時(shí)使用該注解。

除了使用@RefreshScope注解外,還有其他方式可以實(shí)現(xiàn)配置的動(dòng)態(tài)更新,特別是對(duì)于特定的屬性或配置,如線程池參數(shù)。一種常見(jiàn)的做法是使用Spring Cloud的@ConfigurationProperties@EventListener注解來(lái)監(jiān)聽(tīng)配置變更事件。這種方法相對(duì)于使用@RefreshScope,可以提供更細(xì)粒度的控制,尤其是當(dāng)你只需要根據(jù)配置變更動(dòng)態(tài)更新特定的bean或?qū)傩詴r(shí)。

使用@ConfigurationProperties和事件監(jiān)聽(tīng)

下面的示例展示了如何使用@ConfigurationProperties@EventListener來(lái)實(shí)現(xiàn)動(dòng)態(tài)更新線程池配置:

  • 定義配置屬性類(lèi):首先定義一個(gè)配置屬性類(lèi),用來(lái)綁定線程池的配置參數(shù)。
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "thread.pool")
public class ThreadPoolProperties {
    private int coreSize;
    private int maxSize;
    private int queueCapacity;

    // Getters and setters
    public int getCoreSize() {
        return coreSize;
    }

    public void setCoreSize(int coreSize) {
        this.coreSize = coreSize;
    }

    public int getMaxSize() {
        return maxSize;
    }

    public void setMaxSize(int maxSize) {
        this.maxSize = maxSize;
    }

    public int getQueueCapacity() {
        return queueCapacity;
    }

    public void setQueueCapacity(int queueCapacity) {
        this.queueCapacity = queueCapacity;
    }
}
  • 監(jiān)聽(tīng)配置變更事件:在定義線程池的配置類(lèi)中,添加一個(gè)事件監(jiān)聽(tīng)器,監(jiān)聽(tīng)配置變更事件,然后動(dòng)態(tài)更新線程池的配置。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.EventListener;
import org.springframework.cloud.context.scope.refresh.RefreshScopeRefreshedEvent;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;

@Configuration
public class ThreadPoolConfig {

    @Autowired
    private ThreadPoolProperties properties;

    private ThreadPoolTaskExecutor executor;

    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {
        executor = new ThreadPoolTaskExecutor();
        updateThreadPoolExecutor(properties);
        return executor;
    }

    @EventListener(RefreshScopeRefreshedEvent.class)
    public void onRefresh(RefreshScopeRefreshedEvent event) {
        updateThreadPoolExecutor(properties);
    }


    // 假設(shè)這是一個(gè)成員變量,用于持有當(dāng)前的線程池實(shí)例
    private volatile ThreadPoolTaskExecutor executor;

    private void updateThreadPoolExecutor(ThreadPoolProperties properties) {
        if (executor != null) {
            // 安全關(guān)閉現(xiàn)有的線程池
            shutdownAndAwaitTermination(executor.getThreadPoolExecutor());
        }

        // 使用新的配置參數(shù)創(chuàng)建并初始化一個(gè)新的線程池實(shí)例
        ThreadPoolTaskExecutor newExecutor = new ThreadPoolTaskExecutor();
        newExecutor.setCorePoolSize(properties.getCoreSize());
        newExecutor.setMaxPoolSize(properties.getMaxSize());
        newExecutor.setQueueCapacity(properties.getQueueCapacity());
        newExecutor.setThreadNamePrefix("custom-executor-");
        newExecutor.initialize();

        // 更新引用,使用新的線程池實(shí)例
        this.executor = newExecutor;
    }

    private void shutdownAndAwaitTermination(Executor executor) {
        if (executor instanceof java.util.concurrent.ThreadPoolExecutor) {
            java.util.concurrent.ThreadPoolExecutor threadPool = (java.util.concurrent.ThreadPoolExecutor) executor;
            threadPool.shutdown(); // 禁止提交新任務(wù)
            try {
                // 等待一段時(shí)間以終止現(xiàn)有任務(wù)
                if (!threadPool.awaitTermination(30, TimeUnit.SECONDS)) {
                    threadPool.shutdownNow(); // 取消當(dāng)前正在執(zhí)行的任務(wù)
                    // 等待一段時(shí)間,等待任務(wù)對(duì)取消做出響應(yīng)
                    if (!threadPool.awaitTermination(30, TimeUnit.SECONDS))
                        System.err.println("線程池未完全終止");
                }
            } catch (InterruptedException ie) {
                // (重新-)如果當(dāng)前線程也中斷,則取消
                threadPool.shutdownNow();
                // 保留中斷狀態(tài)
                Thread.currentThread().interrupt();
            }
        }
    }
}

這個(gè)方法通過(guò)監(jiān)聽(tīng)RefreshScopeRefreshedEvent事件,每當(dāng)配置發(fā)生變更且刷新作用域時(shí),它會(huì)觸發(fā)onRefresh方法,然后根據(jù)最新的配置更新線程池參數(shù)。

優(yōu)點(diǎn)

  • 細(xì)粒度控制:這種方法允許對(duì)特定的配置項(xiàng)進(jìn)行細(xì)粒度的更新,而不是刷新整個(gè)Bean。
  • 性能:相比于@RefreshScope可能導(dǎo)致的重建Bean,這種方法只更新需要變更的配置項(xiàng),可能對(duì)性能影響較小。

以上就是Nacos配合SpringBoot實(shí)現(xiàn)動(dòng)態(tài)線程池的步驟詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Nacos動(dòng)態(tài)線程池的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • spring使用aspect注解切面不起作用的排查過(guò)程及解決

    spring使用aspect注解切面不起作用的排查過(guò)程及解決

    這篇文章主要介紹了spring使用aspect注解切面不起作用的排查過(guò)程及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 基于Jenkins自動(dòng)打包并部署docker環(huán)境的操作過(guò)程

    基于Jenkins自動(dòng)打包并部署docker環(huán)境的操作過(guò)程

    這篇文章主要介紹了基于Jenkins自動(dòng)打包并部署docker環(huán)境,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • springboot實(shí)現(xiàn)打印彩色日志

    springboot實(shí)現(xiàn)打印彩色日志

    這篇文章主要介紹了springboot實(shí)現(xiàn)打印彩色日志的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java使用FFM?API調(diào)用SDL詳解

    Java使用FFM?API調(diào)用SDL詳解

    這篇文章主要為大家詳細(xì)介紹了Java如何使用FFM?API調(diào)用SDL,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下
    2025-01-01
  • JavaWeb開(kāi)發(fā)入門(mén)第一篇必備知識(shí)講解

    JavaWeb開(kāi)發(fā)入門(mén)第一篇必備知識(shí)講解

    JavaWeb開(kāi)發(fā)入門(mén)第一篇主要內(nèi)容介紹的是必備知識(shí)、基礎(chǔ)知識(shí)、搭建JavaWeb應(yīng)用開(kāi)發(fā)環(huán)境,感興趣的小伙伴們可以參考一下
    2016-04-04
  • JAVA?ServLet創(chuàng)建一個(gè)項(xiàng)目的基本步驟

    JAVA?ServLet創(chuàng)建一個(gè)項(xiàng)目的基本步驟

    Servlet是Server Applet的簡(jiǎn)稱(chēng),是運(yùn)行在服務(wù)器上的小程序,用于編寫(xiě)Java的服務(wù)器端程序,它的主要作用是接收并響應(yīng)來(lái)自Web客戶端的請(qǐng)求,下面這篇文章主要給大家介紹了關(guān)于JAVA?ServLet創(chuàng)建一個(gè)項(xiàng)目的基本步驟,需要的朋友可以參考下
    2024-03-03
  • java基于移位操作實(shí)現(xiàn)二進(jìn)制處理的方法示例

    java基于移位操作實(shí)現(xiàn)二進(jìn)制處理的方法示例

    這篇文章主要介紹了java基于移位操作實(shí)現(xiàn)二進(jìn)制處理的方法,結(jié)合實(shí)例形式分析了java針對(duì)二進(jìn)制的移位操作處理技巧,需要的朋友可以參考下
    2017-02-02
  • Spring Boot中定時(shí)任務(wù)Cron表達(dá)式的終極指南最佳實(shí)踐記錄

    Spring Boot中定時(shí)任務(wù)Cron表達(dá)式的終極指南最佳實(shí)踐記錄

    本文詳細(xì)介紹了SpringBoot中定時(shí)任務(wù)的實(shí)現(xiàn)方法,特別是Cron表達(dá)式的使用技巧和高級(jí)用法,從基礎(chǔ)語(yǔ)法到復(fù)雜場(chǎng)景,從快速啟用到調(diào)試驗(yàn)證,再到常見(jiàn)問(wèn)題的解決,涵蓋了定時(shí)任務(wù)開(kāi)發(fā)的全過(guò)程,感興趣的朋友一起看看吧
    2025-03-03
  • SpringBoot集成阿里巴巴Druid監(jiān)控的示例代碼

    SpringBoot集成阿里巴巴Druid監(jiān)控的示例代碼

    這篇文章主要介紹了SpringBoot集成阿里巴巴Druid監(jiān)控的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • IntelliJ IDEA之高效代碼插件RainBow Brackets詳解

    IntelliJ IDEA之高效代碼插件RainBow Brackets詳解

    這篇文章主要介紹了IntelliJ IDEA之高效代碼插件RainBow Brackets詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論