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

SpringBoot集成自定義線程池和異常處理的兩種方式

 更新時間:2026年06月30日 09:15:30   作者:Listen·Rain  
這篇文章主要介紹了SpringBoot集成自定義線池,詳解配置步驟、使用@Async注解實現(xiàn)異步調(diào)用,并討論CompletableFuture異常處理及全局異常捕;SpringBoot異步處理機制與自定義異常處理器配置方法,需要的朋友可以參考下

一.Spring Boot 集成自定義線程池

在 Spring Boot 中,通過 @Configuration 配置 Bean,并結(jié)合 @Async 注解或手動注入 ThreadPoolTaskExecutor,可實現(xiàn)聲明式異步調(diào)用。

1、配置自定義線程池

創(chuàng)建配置類,定義 ThreadPoolTaskExecutor Bean,確保參數(shù)可控且線程命名規(guī)范。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;

@Configuration
public class AsyncConfig {

    @Bean("bizTaskExecutor")
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(100);
        executor.setKeepAliveSeconds(60);
        executor.setThreadNamePrefix("biz-async-");
        // 拒絕策略:由調(diào)用線程執(zhí)行,起到背壓作用
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.initialize();
        return executor;
    }
}

2、使用 @Async 實現(xiàn)聲明式異步

在 Service 層方法上添加 @Async("bizTaskExecutor"),指定使用上述自定義線程池。

注意:

  1. 啟動類需添加 @EnableAsync。
  2. 異步方法必須在另一個類中調(diào)用(自調(diào)用無效),因為 Spring AOP 基于代理。
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;

@Service
public class OrderService {

    @Async("bizTaskExecutor")
    public CompletableFuture<String> queryUserAsync() {
        try { Thread.sleep(1000); } catch (InterruptedException e) {}
        return CompletableFuture.completedFuture("User_1001");
    }

    @Async("bizTaskExecutor")
    public CompletableFuture<String> queryOrderAsync() {
        try { Thread.sleep(1200); } catch (InterruptedException e) {}
        return CompletableFuture.completedFuture("Order_List");
    }
}

3、Controller 中編排異步結(jié)果

在 Controller 中注入 Service,利用 CompletableFuture 組合多個異步任務(wù)的結(jié)果。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.CompletableFuture;

@RestController
public class OrderController {

    @Autowired
    private OrderService orderService;

    @GetMapping("/order/detail")
    public String getOrderDetail() throws Exception {
        // 并行發(fā)起兩個異步請求
        CompletableFuture<String> userFuture = orderService.queryUserAsync();
        CompletableFuture<String> orderFuture = orderService.queryOrderAsync();

        // 等待所有任務(wù)完成并合并結(jié)果
        CompletableFuture.allOf(userFuture, orderFuture).join();
        
        return "用戶: " + userFuture.get() + ", 訂單: " + orderFuture.get();
    }
}

4、關(guān)鍵注意事項

  1. 返回值類型:@Async 方法若需返回結(jié)果,必須返回 CompletableFuture<T>Future<T>,否則調(diào)用方無法獲取返回值。
  2. 異常處理:異步方法中的異常不會直接拋出到 Controller。建議配置全局 AsyncUncaughtExceptionHandler 或在 CompletableFuture 鏈中處理。
  3. 事務(wù)問題:@Async 方法默認(rèn)不在主事務(wù)中運行。若需事務(wù),需在異步方法內(nèi)部單獨開啟 @Transactional

二.Spring Boot 異步全局異常處理

在 Spring Boot 中,@Async 方法的異常無法被 Controller 的 @ExceptionHandler 捕獲。需配置 AsyncUncaughtExceptionHandler 進行統(tǒng)一兜底,防止異常靜默丟失。

1、自定義異常處理器

實現(xiàn) AsyncUncaughtExceptionHandler 接口,記錄日志或發(fā)送告警。

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Method;

@Slf4j
public class CustomAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {

    @Override
    public void handleUncaughtException(Throwable ex, Method method, Object... params) {
        log.error("異步任務(wù)異常 - 方法: {}, 參數(shù): {}", method.getName(), params, ex);
        // 此處可集成監(jiān)控告警(如 Sentry/Prometheus)
    }
}

2、注冊到 Spring 容器

在配置類中重寫 getAsyncExecutorgetAsyncUncaughtExceptionHandler 方法。

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(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("biz-async-");
        executor.initialize();
        return executor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new CustomAsyncExceptionHandler();
    }
}

3、CompletableFuture 的異常處理

若使用 CompletableFuture,需在鏈?zhǔn)秸{(diào)用末尾添加 exceptionallyhandle,確保業(yè)務(wù)級異常被捕獲。

future.thenApply(res -> process(res))
      .exceptionally(ex -> {
          log.error("業(yè)務(wù)處理失敗", ex);
          return defaultResult; // 返回默認(rèn)值,防止鏈路中斷
      });

4、核心區(qū)別總結(jié)

場景異常捕獲方式適用情況
@Async 無返回值AsyncUncaughtExceptionHandler簡單通知、日志記錄等“發(fā)了就不管”的場景。
CompletableFuture.exceptionally() / .handle()需要獲取結(jié)果、進行業(yè)務(wù)補償或降級的場景。
Controller 層@RestControllerAdvice無效。無法捕獲異步線程拋出的異常。

以上就是SpringBoot集成自定義線程池和異常處理的兩種方式的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot集成自定義線程池和異常處理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java RSA加密工具類的設(shè)計與實現(xiàn)詳解

    Java RSA加密工具類的設(shè)計與實現(xiàn)詳解

    RSA算法是一種常用的非對稱加密算法,這篇文章主要為大家詳細(xì)介紹了如何通過Java編寫一個RSA加密工具類,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • java在原字符中插入新字符或字符串實例

    java在原字符中插入新字符或字符串實例

    這篇文章主要介紹了java在原字符中插入新字符或字符串實例,具有很好的價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 用html css javascript打造自己的RIA圖文教程

    用html css javascript打造自己的RIA圖文教程

    用html&css&javascript打造自己的RIA之一,包括了配置等
    2009-07-07
  • java高效讀大文件(csv,text)的幾種處理方式

    java高效讀大文件(csv,text)的幾種處理方式

    這篇文章主要給大家介紹了關(guān)于java高效讀大文件(csv,text)的幾種處理方式,Java中處理大文件時,通常需要采取一些特定的策略來避免內(nèi)存溢出或性能問題,文中通過代碼及圖片介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • Java利用Picocli開發(fā)一個簡化命令行工具

    Java利用Picocli開發(fā)一個簡化命令行工具

    Picocli 是一個強大、易用且功能豐富的 Java 庫,用于開發(fā)命令行工具,本文我們就來為大家介紹一下Java如何利用Picocli進行命令行簡化功能的吧
    2025-03-03
  • Spring事務(wù)執(zhí)行流程及如何創(chuàng)建事務(wù)

    Spring事務(wù)執(zhí)行流程及如何創(chuàng)建事務(wù)

    這篇文章主要介紹了Spring事務(wù)執(zhí)行流程及如何創(chuàng)建事務(wù),幫助大家更好的理解和學(xué)習(xí)使用spring框架,感興趣的朋友可以了解下
    2021-03-03
  • Spring @Lazy注解的定義及詳細(xì)源碼展示

    Spring @Lazy注解的定義及詳細(xì)源碼展示

    @Lazy是Spring延遲初始化Bean的注解,通過推遲實例化時機減少啟動時間與內(nèi)存占用,適用于高成本Bean、條件化延遲及解決循環(huán)依賴,但需注意首次使用性能開銷與依賴順序問題,本文給大家介紹Spring @Lazy注解的定義及詳細(xì)源碼展示,感興趣的朋友一起看看吧
    2025-09-09
  • 基于jvm java內(nèi)存區(qū)域的介紹

    基于jvm java內(nèi)存區(qū)域的介紹

    下面小編就為大家?guī)硪黄趈vm java內(nèi)存區(qū)域的介紹。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • java實現(xiàn)自定義日期選擇器的方法實例

    java實現(xiàn)自定義日期選擇器的方法實例

    日期選擇器是我們?nèi)粘i_發(fā)中經(jīng)常需要用到的一個功能,下面這篇文章主要給大家介紹了關(guān)于利用java實現(xiàn)自定義日期選擇器的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • Mybatis實現(xiàn)動態(tài)建表代碼實例

    Mybatis實現(xiàn)動態(tài)建表代碼實例

    這篇文章主要介紹了Mybatis實現(xiàn)動態(tài)建表代碼實例,解釋一下,就是指根據(jù)傳入的表名,動態(tài)地創(chuàng)建數(shù)據(jù)庫表,以供后面的業(yè)務(wù)場景使用,
    而使用 Mybatis 的動態(tài) SQL,就能很好地為我們解決這個問題,需要的朋友可以參考下
    2023-10-10

最新評論

台前县| 宁化县| 乳山市| 关岭| 平湖市| 沙洋县| 辽中县| 澳门| 常州市| 永年县| 蚌埠市| 大化| 光泽县| 偏关县| 江达县| 浦东新区| 屏边| 左权县| 定襄县| 临泽县| 吉木萨尔县| 太康县| 白朗县| 吐鲁番市| 肇庆市| 那曲县| 资溪县| 桂阳县| 和静县| 海兴县| 苗栗市| 南宁市| 渝中区| 白河县| 德江县| 邵阳县| 高州市| 定陶县| 河东区| 辽宁省| 海伦市|