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

SpringBoot中使用@Async實(shí)現(xiàn)異步調(diào)用?方法示例

 更新時(shí)間:2025年12月23日 11:21:27   作者:hdsoft_huge  
在Spring Boot中異步調(diào)用是通過Spring的@Async注解來實(shí)現(xiàn)的,它允許我們在不阻塞主線程的情況下執(zhí)行耗時(shí)的操作,這篇文章主要介紹了SpringBoot中使用@Async實(shí)現(xiàn)異步調(diào)用?方法的相關(guān)資料,需要的朋友可以參考下

?前言?

在高并發(fā)、高性能要求的應(yīng)用場景下,異步處理能夠顯著提升系統(tǒng)的響應(yīng)速度和吞吐量。Spring Boot 提供的 @Async 注解為開發(fā)者實(shí)現(xiàn)異步調(diào)用提供了便捷方式。本文將深入探討 @Async 注解的使用場合、創(chuàng)建調(diào)試流程以及相關(guān)注意事項(xiàng),幫助你在項(xiàng)目中優(yōu)雅地運(yùn)用異步調(diào)用。?

一、@Async 注解的使用場合?

耗時(shí)任務(wù)處理?

當(dāng)應(yīng)用程序中存在一些耗時(shí)較長的任務(wù),如文件上傳后的處理、大數(shù)據(jù)量的計(jì)算、第三方接口調(diào)用等,如果采用同步處理,會導(dǎo)致主線程阻塞,影響用戶體驗(yàn)。此時(shí)使用 @Async 注解將這些任務(wù)異步執(zhí)行,主線程無需等待任務(wù)完成,可立即返回響應(yīng),提高系統(tǒng)的響應(yīng)速度。例如,在電商系統(tǒng)中,用戶下單后,可能需要進(jìn)行庫存更新、積分計(jì)算、訂單消息推送等一系列操作,其中積分計(jì)算和消息推送等操作可以異步執(zhí)行,不影響訂單處理的主流程。?

日志記錄?

日志記錄是應(yīng)用程序中常見的功能,但頻繁的磁盤 I/O 操作會影響系統(tǒng)性能。將日志記錄操作異步化,使用 @Async 注解標(biāo)記日志記錄方法,能避免因日志寫入而阻塞主線程,保證業(yè)務(wù)邏輯的高效執(zhí)行。例如,在高并發(fā)的 Web 應(yīng)用中,大量的訪問日志記錄如果同步進(jìn)行,會對系統(tǒng)性能產(chǎn)生較大影響,異步記錄日志則可有效解決這一問題。?

消息通知?

在系統(tǒng)中發(fā)送郵件、短信、推送消息等通知功能時(shí),這些操作通常不需要立即得到結(jié)果,且可能會因網(wǎng)絡(luò)等原因耗時(shí)較長。通過 @Async 注解將消息通知方法設(shè)置為異步執(zhí)行,可使系統(tǒng)在發(fā)送通知的同時(shí)繼續(xù)處理其他業(yè)務(wù),提升整體效率。比如在社交應(yīng)用中,用戶發(fā)布動(dòng)態(tài)后,系統(tǒng)需要向關(guān)注該用戶的其他用戶發(fā)送通知,異步發(fā)送通知可以減少用戶等待時(shí)間。?

緩存更新?

當(dāng)數(shù)據(jù)發(fā)生變化時(shí),需要更新對應(yīng)的緩存。緩存更新操作可能涉及多個(gè)緩存節(jié)點(diǎn)的操作,耗時(shí)較長。將緩存更新方法標(biāo)注為異步,能讓數(shù)據(jù)更新操作在后臺進(jìn)行,不影響業(yè)務(wù)邏輯的正常執(zhí)行,保證系統(tǒng)的高可用性。例如在分布式緩存系統(tǒng)中,更新緩存可能需要與多個(gè)緩存服務(wù)器進(jìn)行交互,異步處理可提高系統(tǒng)性能。?

二、@Async 注解的創(chuàng)建與調(diào)試?

啟用異步支持?

在 Spring Boot 項(xiàng)目中,要使用 @Async 注解,首先需要在配置類上添加 @EnableAsync 注解,啟用異步支持。例如:?

import org.springframework.context.annotation.Configuration;?
import org.springframework.scheduling.annotation.EnableAsync;?
?
@Configuration?
@EnableAsync?
public class AsyncConfig {?
    // 可在此處進(jìn)行更多異步相關(guān)的配置,如線程池配置?
}?

上述代碼創(chuàng)建了一個(gè)配置類 AsyncConfig,并通過 @EnableAsync 注解開啟了 Spring Boot 的異步功能。?

使用 @Async 注解標(biāo)記異步方法?

在需要異步執(zhí)行的方法上添加 @Async 注解。通常在 Service 層的方法上使用,示例如下:?

import org.springframework.scheduling.annotation.Async;?
import org.springframework.stereotype.Service;?
?
@Service?
public class AsyncService {?
?
    @Async?
    public void asyncTask() {?
        // 模擬耗時(shí)操作?
        try {?
            Thread.sleep(3000);?
        } catch (InterruptedException e) {?
            e.printStackTrace();?
        }?
        System.out.println("異步任務(wù)執(zhí)行完成");?
    }?
}?

?在上述代碼中,AsyncService 類的 asyncTask 方法被 @Async 注解標(biāo)記,該方法將異步執(zhí)行。?

調(diào)用異步方法?

在其他組件中注入 AsyncService 并調(diào)用異步方法,例如在 Controller 中調(diào)用:?

import org.springframework.beans.factory.annotation.Autowired;?
import org.springframework.web.bind.annotation.GetMapping;?
import org.springframework.web.bind.annotation.RestController;?
?
@RestController?
public class AsyncController {?
?
    @Autowired?
    private AsyncService asyncService;?
?
    @GetMapping("/async")?
    public String async() {?
        asyncService.asyncTask();?
        return "異步任務(wù)已提交";?
    }?
}?

?當(dāng)訪問 /async 接口時(shí),asyncTask 方法會異步執(zhí)行,主線程立即返回響應(yīng)。?

調(diào)試異步方法?

調(diào)試異步方法時(shí),由于異步方法在新的線程中執(zhí)行,常規(guī)的斷點(diǎn)調(diào)試可能無法直接命中??梢圆捎靡韵路椒ㄟM(jìn)行調(diào)試:?
日志輸出:在異步方法中添加詳細(xì)的日志輸出,通過日志信息了解方法的執(zhí)行流程和變量值。例如在 asyncTask 方法中添加 System.out.println 語句輸出關(guān)鍵步驟的信息。?

調(diào)試工具設(shè)置:在 IDE 中進(jìn)行特定設(shè)置,如在 IntelliJ IDEA 中,在 Run/Debug Configurations 中,找到對應(yīng)的啟動(dòng)配置,在 VM options 中添加 -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005,然后以調(diào)試模式啟動(dòng)項(xiàng)目,使用遠(yuǎn)程調(diào)試工具連接到指定端口進(jìn)行調(diào)試。?

異常處理:在異步方法中添加合適的異常處理代碼,當(dāng)異步任務(wù)出現(xiàn)異常時(shí),通過捕獲異常并輸出異常信息,定位問題所在。例如:?

import org.springframework.scheduling.annotation.Async;?
import org.springframework.stereotype.Service;?
?
@Service?
public class AsyncService {?
?
    @Async?
    public void asyncTask() {?
        try {?
            // 模擬耗時(shí)操作?
            Thread.sleep(3000);?
            // 模擬可能出現(xiàn)的異常?
            int result = 1 / 0;?
        } catch (InterruptedException e) {?
            e.printStackTrace();?
        } catch (Exception e) {?
            System.out.println("異步任務(wù)執(zhí)行出錯(cuò):" + e.getMessage());?
        }?
        System.out.println("異步任務(wù)執(zhí)行完成");?
    }?
}?
?

三、@Async 注解的注意事項(xiàng)?

線程池配置?

默認(rèn)情況下,@Async 使用 Spring 內(nèi)置的簡單線程池,在高并發(fā)場景下可能無法滿足需求。建議根據(jù)實(shí)際業(yè)務(wù)情況配置自定義線程池,通過實(shí)現(xiàn) AsyncConfigurer 接口來配置線程池的核心線程數(shù)、最大線程數(shù)、隊(duì)列容量等參數(shù)。示例如下:?

import org.springframework.context.annotation.Bean;?
import org.springframework.context.annotation.Configuration;?
import org.springframework.scheduling.annotation.AsyncConfigurer;?
import org.springframework.scheduling.annotation.EnableAsync;?
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;?
?
import java.util.concurrent.Executor;?
?
@Configuration?
@EnableAsync?
public class AsyncConfig implements AsyncConfigurer {?
?
    @Override?
    @Bean?
    public Executor getAsyncExecutor() {?
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();?
        executor.setCorePoolSize(5);?
        executor.setMaxPoolSize(10);?
        executor.setQueueCapacity(200);?
        executor.setThreadNamePrefix("Async-");?
        executor.initialize();?
        return executor;?
    }?
}?
?

上述代碼配置了一個(gè)核心線程數(shù)為 5,最大線程數(shù)為 10,隊(duì)列容量為 200 的線程池。?

異常處理?

異步方法中拋出的異常不會被調(diào)用方直接捕獲,如果不進(jìn)行特殊處理,異??赡軙缓雎???梢酝ㄟ^兩種方式處理異步方法中的異常:?
使用 Future 接收返回值:將異步方法的返回值類型改為 Future,通過 Future 的 get 方法獲取異步任務(wù)的執(zhí)行結(jié)果,在獲取結(jié)果時(shí)捕獲異常。例如:?

import org.springframework.scheduling.annotation.Async;?
import org.springframework.stereotype.Service;?
import java.util.concurrent.Future;?
?
@Service?
public class AsyncService {?
?
    @Async?
    public Future<String> asyncTask() {?
        try {?
            // 模擬耗時(shí)操作?
            Thread.sleep(3000);?
            // 模擬可能出現(xiàn)的異常?
            int result = 1 / 0;?
            return new java.util.concurrent.FutureTask<>(() -> "任務(wù)成功");?
        } catch (InterruptedException e) {?
            e.printStackTrace();?
        } catch (Exception e) {?
            // 可以在這里進(jìn)行異常處理或記錄日志?
        }?
        return null;?
    }?
}?
?

在調(diào)用方獲取 Future 結(jié)果時(shí)捕獲異常:??

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.ExecutionException;?
import java.util.concurrent.Future;?
?
@RestController?
public class AsyncController {?
?
    @Autowired?
    private AsyncService asyncService;?
?
    @GetMapping("/async")?
    public String async() {?
        Future<String> future = asyncService.asyncTask();?
        try {?
            String result = future.get();?
            return result;?
        } catch (InterruptedException | ExecutionException e) {?
            e.printStackTrace();?
            return "異步任務(wù)執(zhí)行出錯(cuò)";?
        }?
    }?
}?

?自定義異常處理機(jī)制:實(shí)現(xiàn) AsyncUncaughtExceptionHandler 接口,自定義異步方法未捕獲異常的處理邏輯。例如:??

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;?
import java.lang.reflect.Method;?
?
public class CustomAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {?
?
    @Override?
    public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {?
        System.out.println("異步方法 [" + method.getName() + "] 拋出異常:" + throwable.getMessage());?
        // 可以在此處添加更詳細(xì)的異常處理邏輯,如記錄日志、發(fā)送告警等?
    }?
}?
?

在 AsyncConfig 中配置自定義的異常處理器:?

import org.springframework.context.annotation.Bean;?
import org.springframework.context.annotation.Configuration;?
import org.springframework.scheduling.annotation.AsyncConfigurer;?
import org.springframework.scheduling.annotation.EnableAsync;?
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;?
?
import java.util.concurrent.Executor;?
?
@Configuration?
@EnableAsync?
public class AsyncConfig implements AsyncConfigurer {?
?
    @Override?
    @Bean?
    public Executor getAsyncExecutor() {?
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();?
        executor.setCorePoolSize(5);?
        executor.setMaxPoolSize(10);?
        executor.setQueueCapacity(200);?
        executor.setThreadNamePrefix("Async-");?
        executor.initialize();?
        return executor;?
    }?
?
    @Override?
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {?
        return new CustomAsyncExceptionHandler();?
    }?
}?

類內(nèi)部調(diào)用問題?

在同一個(gè)類中,直接調(diào)用被 @Async 注解標(biāo)記的方法,異步調(diào)用不會生效。因?yàn)?Spring 是通過代理機(jī)制實(shí)現(xiàn) @Async 功能的,類內(nèi)部調(diào)用無法觸發(fā)代理,也就無法實(shí)現(xiàn)異步。解決方法是將異步方法提取到獨(dú)立的類中,通過依賴注入的方式調(diào)用。?

事務(wù)管理?

當(dāng)異步方法涉及事務(wù)操作時(shí),需要注意事務(wù)的傳播行為和生效范圍。默認(rèn)情況下,異步方法開啟新的事務(wù),與調(diào)用方的事務(wù)相互獨(dú)立。如果需要在異步方法中共享調(diào)用方的事務(wù),可通過設(shè)置事務(wù)傳播行為為 REQUIRES_NEW 或 NESTED 來實(shí)現(xiàn)。同時(shí),確保事務(wù)管理器在異步線程中正確配置和生效。?

四、總結(jié)?

@Async 注解為 Spring Boot 應(yīng)用實(shí)現(xiàn)異步調(diào)用提供了簡潔高效的方式,合理運(yùn)用能顯著提升系統(tǒng)性能和用戶體驗(yàn)。在使用過程中,要根據(jù)具體業(yè)務(wù)場景選擇合適的使用場合,掌握正確的創(chuàng)建調(diào)試方法,并注意線程池配置、異常處理、類內(nèi)部調(diào)用、事務(wù)管理等方面的問題。通過深入理解和熟練運(yùn)用 @Async 注解,讓你的 Spring Boot 項(xiàng)目在處理異步任務(wù)時(shí)更加優(yōu)雅和高效。?

希望以上內(nèi)容能幫助你在項(xiàng)目中更好地使用 @Async 注解。如果你在實(shí)踐中有任何疑問,或者想了解更多相關(guān)技巧,歡迎在評論區(qū)交流分享。?

以上內(nèi)容涵蓋了@Async注解多方面要點(diǎn),能助你掌握其用法。若你對文中某個(gè)部分想深入探討,或有其他補(bǔ)充需求,歡迎隨時(shí)說。

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

相關(guān)文章

  • SpringBoot集成RabbitMQ和概念介紹

    SpringBoot集成RabbitMQ和概念介紹

    這篇文章主要介紹了SpringBoot集成RabbitMQ和概念介紹,RabbitMQ即一個(gè)消息隊(duì)列,主要是用來實(shí)現(xiàn)應(yīng)用程序的異步和解耦,同時(shí)也能起到消息緩沖,消息分發(fā)的作用。更多相關(guān)內(nèi)容需要的小伙伴可以參考一下下面文章內(nèi)容
    2022-05-05
  • spring?@Scheduled注解各參數(shù)使用以及定時(shí)任務(wù)詳解

    spring?@Scheduled注解各參數(shù)使用以及定時(shí)任務(wù)詳解

    文章詳細(xì)介紹了Spring框架中@Scheduled注解的各個(gè)參數(shù),包括cron表達(dá)式、時(shí)區(qū)、fixedDelay、fixedRate、initialDelay等,并提供了多個(gè)示例來說明這些參數(shù)的使用方法
    2024-11-11
  • JAVA區(qū)間值判斷[10,20)的實(shí)現(xiàn)

    JAVA區(qū)間值判斷[10,20)的實(shí)現(xiàn)

    本文主要介紹了JAVA區(qū)間值判斷[10,20)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法

    java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法

    java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法,需要的朋友可以參考一下
    2013-03-03
  • 解決FileWriter 寫入文本不換行的問題

    解決FileWriter 寫入文本不換行的問題

    這篇文章主要介紹了解決FileWriter 寫入文本不換行的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot的pom.xml文件中設(shè)置多環(huán)境配置信息方法詳解

    SpringBoot的pom.xml文件中設(shè)置多環(huán)境配置信息方法詳解

    這篇文章主要給大家介紹了關(guān)于SpringBoot的pom.xml文件中設(shè)置多環(huán)境配置信息的相關(guān)資料,Java項(xiàng)目通過pom.xml管理多中間件和多環(huán)境配置,結(jié)合application.yml動(dòng)態(tài)替換配置文件,利用Maven切換不同環(huán)境配置,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-05-05
  • mybatis中string和date的轉(zhuǎn)換方式

    mybatis中string和date的轉(zhuǎn)換方式

    這篇文章主要介紹了mybatis中string和date的轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot使用EmbeddedDatabaseBuilder進(jìn)行數(shù)據(jù)庫集成測試

    SpringBoot使用EmbeddedDatabaseBuilder進(jìn)行數(shù)據(jù)庫集成測試

    在開發(fā)SpringBoot應(yīng)用程序時(shí),我們通常需要與數(shù)據(jù)庫進(jìn)行交互,為了確保我們的應(yīng)用程序在生產(chǎn)環(huán)境中可以正常工作,我們需要進(jìn)行數(shù)據(jù)庫集成測試,在本文中,我們將介紹如何使用 SpringBoot 中的 EmbeddedDatabaseBuilder 來進(jìn)行數(shù)據(jù)庫集成測試
    2023-07-07
  • SpringBoot如何使用Template請求http接口

    SpringBoot如何使用Template請求http接口

    在Spring?Boot中,如果你想要通過模板(template)的方式連接HTTP服務(wù),并發(fā)送HTTP請求,有幾種不同的方式可以實(shí)現(xiàn),但最直接和常用的方式之一是使用RestTemplate,這篇文章主要介紹了SpringBoot使用Template請求http接口,需要的朋友可以參考下
    2024-08-08
  • Java發(fā)送post方法詳解

    Java發(fā)送post方法詳解

    這篇文章主要介紹了Java發(fā)送post方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評論

勐海县| 如东县| 商水县| 古交市| 高陵县| SHOW| 永兴县| 临城县| 新郑市| 东源县| 台前县| 寿宁县| 平乐县| 上林县| 诸城市| 丹东市| 新巴尔虎左旗| 辛集市| 南部县| 伊川县| 正镶白旗| 临江市| 绥德县| 青阳县| 新河县| 定安县| 东莞市| 淮安市| 高台县| 津市市| 鄂托克旗| 香港 | 井陉县| 陇南市| 古田县| 都江堰市| 泰安市| 赞皇县| 鲁山县| 遵义县| 双辽市|