學習文章:Spring Boot 中如何使用 `@Async` 實現異步處理

文章目錄

      • 學習文章:Spring Boot 中如何使用 `@Async` 實現異步處理
    • 一、什么是 `@Async`?
      • 優點:
    • 二、Spring Boot 中啟用 `@Async`
      • 1. 啟用異步支持
      • 2. 配置線程池(可選)
      • 3. 使用 `@Async` 注解
      • 4. 調用異步方法
    • 三、`@Async` 的進階用法
      • 1. 指定線程池
      • 2. 返回值
      • 3. 異常處理
    • 四、`@Async` 的應用場景
      • 1. 耗時任務
      • 2. 高并發請求
      • 3. 定時任務
      • 4. 外部 API 調用
    • 五、注意事項
    • 六、總結


學習文章:Spring Boot 中如何使用 @Async 實現異步處理

在現代Web應用中,處理高并發請求和耗時任務是一個常見的挑戰。如果所有請求都在主線程中同步處理,可能會導致性能瓶頸,影響用戶體驗。Spring Boot 提供了 @Async 注解,可以輕松實現異步處理,從而提高系統的并發能力和響應速度。

本文將詳細介紹如何在 Spring Boot 中使用 @Async,包括基本用法、配置、異常處理以及實際應用場景。


一、什么是 @Async

@Async 是 Spring 框架提供的一個注解,用于標記一個方法為異步執行。當一個方法被標記為 @Async 時,Spring 會在調用該方法時將其放入一個獨立的線程中執行,而不會阻塞主線程。

優點:

  1. 提高性能:將耗時任務放入異步線程中執行,避免阻塞主線程。
  2. 提升用戶體驗:快速響應用戶請求,避免長時間等待。
  3. 資源優化:合理利用線程池資源,避免資源浪費。

二、Spring Boot 中啟用 @Async

在 Spring Boot 中使用 @Async 需要以下步驟:

1. 啟用異步支持

在 Spring Boot 主類或配置類上添加 @EnableAsync 注解,以啟用異步支持。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;@SpringBootApplication
@EnableAsync
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

2. 配置線程池(可選)

默認情況下,Spring 使用一個簡單的線程池來執行異步任務。為了更好地控制線程池的行為,可以自定義線程池配置。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;@Configuration
public class AsyncConfig {@Bean(name = "taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(10); // 核心線程數executor.setMaxPoolSize(20);  // 最大線程數executor.setQueueCapacity(50); // 隊列容量executor.setThreadNamePrefix("Async-"); // 線程名前綴executor.initialize();return executor;}
}

3. 使用 @Async 注解

在需要異步執行的方法上添加 @Async 注解。

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;@Service
public class AsyncService {@Asyncpublic void asyncMethod() {try {Thread.sleep(5000); // 模擬耗時任務System.out.println("異步任務執行完成,線程:" + Thread.currentThread().getName());} catch (InterruptedException e) {e.printStackTrace();}}
}

4. 調用異步方法

在控制器或其他服務中調用異步方法。

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 {@Autowiredprivate AsyncService asyncService;@GetMapping("/async")public String triggerAsync() {asyncService.asyncMethod();return "異步任務已觸發";}
}

三、@Async 的進階用法

1. 指定線程池

如果配置了多個線程池,可以通過 @Asyncvalue 屬性指定使用的線程池。

@Async("taskExecutor")
public void asyncMethodWithExecutor() {System.out.println("使用指定線程池執行任務,線程:" + Thread.currentThread().getName());
}

2. 返回值

@Async 方法可以返回 FutureCompletableFuture,以便調用方獲取異步任務的執行結果。

@Async
public CompletableFuture<String> asyncMethodWithReturn() {return CompletableFuture.completedFuture("異步任務執行完成");
}

調用方可以通過 Future.get()CompletableFuture.join() 獲取結果。

3. 異常處理

異步方法中的異常不會傳播到調用方,因此需要在方法內部捕獲并處理異常。可以通過實現 AsyncUncaughtExceptionHandler 來全局處理異步任務中的異常。

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;import java.lang.reflect.Method;
import java.util.concurrent.Executor;@Configuration
public class AsyncExceptionConfig implements AsyncConfigurer {@Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.initialize();return executor;}@Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return (Throwable ex, Method method, Object... params) -> {System.err.println("異步任務執行異常:" + ex.getMessage());};}
}

四、@Async 的應用場景

1. 耗時任務

例如文件上傳、郵件發送、數據導出等耗時操作,適合使用異步處理。

2. 高并發請求

在高并發場景下,將請求放入異步線程中處理,避免阻塞主線程。

3. 定時任務

結合 @Scheduled 注解,實現定時任務的異步執行。

4. 外部 API 調用

調用外部 API 時,使用異步處理避免長時間等待。


五、注意事項

  1. 代理機制@Async 基于 Spring AOP 實現,因此只能作用于 Spring 管理的 Bean 方法。
  2. 私有方法@Async 不能用于私有方法,因為代理無法攔截私有方法調用。
  3. 線程池配置:合理配置線程池參數,避免資源耗盡或任務堆積。
  4. 異常處理:異步方法中的異常不會傳播到調用方,需要單獨處理。

六、總結

通過本文的學習,你應該掌握了以下內容:

  1. 如何在 Spring Boot 中啟用 @Async
  2. 如何配置線程池以優化異步任務執行。
  3. @Async 的進階用法,包括返回值、異常處理等。
  4. @Async 的實際應用場景和注意事項。

@Async 是 Spring Boot 中實現異步處理的有力工具,合理使用可以顯著提升系統性能和用戶體驗。希望本文對你有所幫助,歡迎在評論區分享你的學習心得和問題!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/72180.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72180.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72180.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Manus:成為AI Agent領域的標桿

一、引言 官網&#xff1a;Manus 隨著人工智能技術的飛速發展&#xff0c;AI Agent&#xff08;智能體&#xff09;作為人工智能領域的重要分支&#xff0c;正逐漸從概念走向現實&#xff0c;并在各行各業展現出巨大的應用潛力。在眾多AI Agent產品中&#xff0c;Manus以其獨…

Git Fast-forward 合并詳解:原理、場景與最佳實踐

在使用 Git 進行團隊協作時&#xff0c;我們經常需要合并分支。合并方式有很多種&#xff0c;其中 Fast-forward&#xff08;快速合并&#xff09; 是一種最簡單且無沖突的合并方式。本文將詳細介紹 Fast-forward 的原理、適用場景、常見問題及最佳實踐。 一、Fast-forward 合并…

命令行重啟Ubuntu軟件

我是用Todesk遠程桌面&#xff0c;如果卡死的時候&#xff0c;只能通過ssh連接命令行。于是&#xff0c;就有了如標題所示的需求。 首先&#xff0c;我們看一下todesk在系統里叫什么名字&#xff1a; systemctl list-unit-files | grep -i todesk看到發現是"todeskd.serv…

算法每日一練 (11)

&#x1f4a2;歡迎來到張胤塵的技術站 &#x1f4a5;技術如江河&#xff0c;匯聚眾志成。代碼似星辰&#xff0c;照亮行征程。開源精神長&#xff0c;傳承永不忘。攜手共前行&#xff0c;未來更輝煌&#x1f4a5; 文章目錄 算法每日一練 (11)全排列題目描述解題思路解題代碼c/c…

《Spring日志整合與注入技術:從入門到精通》

1.Spring與日志框架的整合 1.Spring與日志框架進行整合&#xff0c;日志框架就可以在控制臺中&#xff0c;輸出Spring框架運行過程中的一些重要的信息。 好處&#xff1a;方便了解Spring框架的運行過程&#xff0c;利于程序的調試。 Spring如何整合日志框架 Spring5.x整合log4j…

《SQL性能優化指南:新手如何寫出高效的數據庫查詢

新手程序員如何用三個月成為SQL高手&#xff1f;萬字自學指南帶你彎道超車 在數據為王的時代&#xff0c;掌握SQL已成為職場新人的必修課。你可能不知道&#xff0c;僅用三個月系統學習&#xff0c;一個零基礎的小白就能完成從數據庫萌新到SQL達人的蛻變。去年剛畢業的小王就是…

【Unity】在項目中使用VisualScripting

1. 在packagemanager添加插件 2. 在設置中進行初始化。 Edit > Project Settings > Visual Scripting Initialize Visual Scripting You must select Initialize Visual Scripting the first time you use Visual Scripting in a project. Initialize Visual Scripting …

JConsole 在 Linux 上的使用

JConsole 在 Linux 上的使用指南 1. 啟動 JConsole 遠程監控 Linux 服務器上的 JVM 進程 1.1 修改 JMX 配置&#xff0c;允許遠程訪問 在 Linux 服務器 啟動 Java 應用時&#xff0c;需要加上 -Djava.rmi.server.hostname<服務器IP>&#xff0c;完整的啟動參數如下&am…

個人記錄,Unity資源解壓和管理插件

就是經典的兩個AssetStudio 和 Ripper 沒有什么干貨&#xff0c;就是記錄一下&#xff0c;內容沒有很詳細 AssetStudio 說錯了&#xff0c;AssetStudio比較出名&#xff08;曾經&#xff09;&#xff0c;但好像墮落了 是&#xff0c;AssetBundlExtractor 這個工具有個好處就…

編譯skia

1.準備工具 (1)vs2019,到微軟官方下載下載 Visual Studio Tools - 免費安裝 Windows、Mac、Linux (2)ninja,下載地址:Releases ninja-build/ninja GitHub (3)gn,下載地址:https://chrome-infra-packages.appspot.com/p/gn/gn/windows-amd64 (4)skia,下載地址:git …

vue 知識點整理

1.data為什么是一個函數而不是對象 維度對象形式函數形式數據隔離性所有實例共享同一對象&#xff0c;導致數據污染每個實例擁有獨立數據副本復用安全性不適用于可復用組件支持組件安全復用語言機制引用傳遞引發副作用函數返回值實現作用域隔離&#xff08;閉包&#xff09;框…

DeepSeek-Open WebUI部署

1.DeepSeek部署-Win版本 2.DeepSeek部署-Linux版本 3.DeepSeek部署-一鍵部署(Linux版本) 4.DeepSeek部署-進階版本(LinuxGPU) 5.DeepSeek部署-基于vLLM部署 前面部署了vLLM版本以后&#xff0c;訪問它比較麻煩。如何才能更好的實現訪問呢&#xff0c;這個就是我們今天要講的…

(vue)elementUi中el-upload上傳附件之后 點擊附件可下載

(vue)elementUi中el-upload上傳附件之后 點擊附件可下載 handlePreview(file) {console.log(file)const fileUrl https://.../zzy/ file.urlconst a document.createElement(a)a.href fileUrla.download file.namea.style.display none// a.setAttribute(download, file.…

你認為 Java 的優勢是什么?

你認為 Java 的優勢是什么? 回答重點 我覺得可以從跨平臺、垃圾回收、生態、面向對象四個方面來闡述。 跨平臺 首先 Java 是跨平臺的,不同平臺執行的機器碼是不一樣的,而 Java 因為加了一層中間層 JVM,所以可以做到一次編寫多平臺(如 Windows、Linux、macOS)運行,即…

SpringBoot——Maven篇

Spring Boot 是一個用于快速開發基于 Spring 框架的應用程序的工具。它具有許多特性&#xff0c;其中一些重要的特性包括&#xff1a; 1. 自動配置&#xff1a;Spring Boot 提供了自動配置的機制&#xff0c;可以根據應用程序的依賴和環境自動配置應用程序的各種組件&#xff…

搭建基于chatgpt的問答系統

一、語言模型&#xff0c;提問范式與 Token 1.語言模型 大語言模型&#xff08;LLM&#xff09;是通過預測下一個詞的監督學習方式進行訓練的&#xff0c;通過預測下一個詞為訓練目標的方法使得語言模型獲得強大的語言生成能力。 a.基礎語言模型 &#xff08;Base LLM&…

leetcode0056. 合并區間 - medium

1 題目&#xff1a;合并區間 官方難度 - 中等 以數組 intervals 表示若干個區間的集合&#xff0c;其中單個區間為 intervals[i] [starti, endi] 。請你合并所有重疊的區間&#xff0c;并返回 一個不重疊的區間數組&#xff0c;該數組需恰好覆蓋輸入中的所有區間 。 示例 1…

系統開發資源

一、前端篇 1.1 菜鳥CSS教程 1.2 HTML/CSS/JS 在線工具 二、后端篇 三、其他篇 3.1 菜鳥官網 3.2 黑馬程序員學習路線 3.3 根據地區獲取經緯度

計算機視覺cv2入門之圖像的讀取,顯示,與保存

在計算機視覺領域&#xff0c;Python的cv2庫是一個不可或缺的工具&#xff0c;它提供了豐富的圖像處理功能。作為OpenCV的Python接口&#xff0c;cv2使得圖像處理的實現變得簡單而高效。 示例圖片 目錄 opencv獲取方式 圖像基本知識 顏色空間 RGB HSV 圖像格式 BMP格式 …

k8s面試題總結(十五)

1.如何使用Kubernetes進行多環境部署&#xff08;如開發&#xff0c;測試和生產環境&#xff09;&#xff1f; 使用命名空間&#xff08;namespaces&#xff09;&#xff1a; 命名空間是用于邏輯隔離和資源分組的一種方式&#xff0c;可以為每個環境創建單獨的命名空間。 2.使…