spring @Async異步執行

在一些后臺耗時的場景比如說生成統計報表,生成數據文件,執行批量任務時候,需要異步執行,先登記信息,然后異步執行批量同步返回給客戶端。在spring中要想使用異步方法執行,必須使用@EnableAsync注解開啟async。

開啟異步執行配置

@Configuration
@EnableAsync
@ComponentScan(basePackages = {"com.cpx.service.async"})
public class AsyncConfig {}

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

@Service
public class AsyncService {@Asyncpublic void exec(){try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(LocalDateTime.now().toString() +":exec end");}
}

添加@Async注解的方法必須是public的。方法所屬的類必須是一個bean才能被掃描到。this方式調用異步方法是沒有效果的。因為使用的動態代理。

測試方法的異步執行:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AsyncConfig.class);
AsyncService asyncService = (AsyncService) ctx.getBean("asyncService");
System.out.println(LocalDateTime.now().toString()+" start");
asyncService.exec();//該方法調用會異步執行
System.out.println(LocalDateTime.now().toString()+" main end");
ctx.close();

TaskExecutor

方法的異步執行是通過線程池來執行的, spring默認會從beanFactory中嘗試去獲取TaskExecutor類型的bean,如果獲取不到,就會繼續嘗試獲取bean name為’taskExecutor’的bean,還獲取不到就創建一個SimpleAsyncTaskExecutor類型的執行器。SimpleAsyncTaskExecutor每來一個任務會啟動一個Thread來執行任務,不會重復利用。這么看SimpleAsyncTaskExecutor不是一個嚴格意義的線程池,線程并不會重用。如果高并發耗時任務可能會導致一定的內存使用問題。這里可以指定線程池。

第一種通過實現AsyncConfigurer接口,然后重寫getAsyncExecutor()方法。

public class AsyncConfig implements AsyncConfigurer {@Overridepublic Executor getAsyncExecutor() {//自定義線程池實現ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();threadPoolTaskExecutor.initialize();return threadPoolTaskExecutor;}
}

這種線程池是所有@Async注解都可以使用,另一種可以在@Async(“taskExecutor”)注解上指定線程池名字。

返回值

可以返回一個future。

@Async
public Future<String> exec(){try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return new AsyncResult<String>("ok");
}

異常處理

有返回的@Async方法異常會被封裝到future里,沒有返回值的可以定義一個AsyncUncaughtExceptionHandler來處理異常

public class CustomAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {@Overridepublic void handleUncaughtException(Throwable ex, Method method, Object... params) {System.out.println(method.getName()+",發生異常");//TODO}
}

然后在實現AsyncConfigurer的bean里重寫getAsyncUncaughtExceptionHandler()返回自定義的異常handler。

異步執行的原理還是通過@EnableAsync引入對應的bean后置處理器,來使用advisor對@Async標識的方法進行代理增強。方法的執行會通過AsyncExecutionInterceptor代理執行。

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

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

相關文章

【JavaEE初階】認識線程、創建線程

1. 認識線程&#xff08;Thread&#xff09; 1.1 概念 1) 線程是什么 一個線程就是一個 "執行流". 每個線程之間都可以按照順序執行自己的代碼. 多個線程之間 "同時" 執行著多份代碼. 舉例&#xff1a; 還是回到我們之前的銀?的例?中。之前我們主要描…

Python開源項目之人工智能老照片修復算法學習

文章目錄 前言項目環境搭建conda虛擬環境創建激活環境Pytorch安裝Synchronized-BatchNorm-PyTorch repository安裝Global目錄Synchronized-BatchNorm-PyTorch項目部署檢測預處理模型下載下載臉部增強模型文件下載依賴完整部署后項目結構 項目使用驗證一下總結關于Python技術儲備…

比較2個點的3種結構在不規則平面上的占比

2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 1 2 2 3 3 3 x 3 3 2 2 2 1 2 2 2 2 2 1 2 2 在平面上有一個點x&#xff0c;再增加一個點,11的操作把平面分成了3部分2a1&#xff0c;2a2&#xff0c;2a3&#xff0c;3部分的比值是 2a1 2a2 2a3 5 25 …

spark中write算子和format算子詳解

在spark中&#xff0c;想要往數據庫或者某sink路徑里面寫數據&#xff0c;存到外部存儲系統&#xff0c;如文件系統、數據庫或數據倉庫&#xff0c;經常會用到write算子。 具體來說&#xff0c;write算子通常與DataFrame或Dataset API一起使用&#xff0c;用于將數據寫入持久化…

IDC最新報告,增速減緩+AI增勢,阿里云視頻云中國市場第一

國際權威數據公司IDC發布 《中國視頻云市場跟蹤&#xff08;2023 H1&#xff09;》報告 自2018年至今&#xff0c;阿里云持續保持 中國視頻云整體市場第一 整體市場占比達24.4% 01 第一之外&#xff0c;低谷之上 近期&#xff0c;國際權威數據公司IDC最新發布了《中國視頻…

做亞馬遜多久可以賺錢?做亞馬遜需要多少資金?——站斧瀏覽器

做亞馬遜需要時間、資金和全面的市場策略。創業者需要有耐心和決心&#xff0c;同時也要靈活應對市場變化。那么做亞馬遜多久可以賺錢,做亞馬遜需要多少資金。 做亞馬遜多久可以賺錢 首先&#xff0c;就像任何其他生意一樣&#xff0c;做亞馬遜需要時間和努力來建立起穩定的客…

怎么給圖片加水印?

怎么給圖片加水印&#xff1f;當代年輕人現在越來越愛在社交平臺中發表自己拍下來的一些趣事和美照&#xff0c;但是同樣的也會有人盜取他人圖片的方式來發布在自己的社交平臺中&#xff0c;而且沒有水印的照片一旦在網上流傳開來以后&#xff0c;很難追溯到它的來源&#xff0…

【MySQL】你知道索引查找起來為什么效率特別高嗎?

索引 前言正式開始磁盤、os、MySQL之間的IOMySQL與存儲扇區結論磁盤隨機訪問(Random Access)與連續訪問(Sequential Access)MySQL 與磁盤交互基本單位小總結簡單介紹一下內存池 談回MySQL簡單理解MySQL中的page為何IO交互基本單位是pagepage結構頁目錄單個page的頁目錄多個page…

井蓋位移傳感器生產廠家推薦,時刻感知井蓋

馬路上的井蓋雖然看似微不足道&#xff0c;但實際上對于行人的“腳下安全”起著至關重要的作用。這些井蓋下連接著供排水、燃氣、電力、供熱、通信等功能的管路和線路&#xff0c;是城市生命線運行的重要保障。因此保持井蓋狀態正常、明確管理責任是確保車輛和行人安全通行的重…

CART算法解密:從原理到Python實現

本文深入探討了CART&#xff08;分類與回歸樹&#xff09;算法的核心原理、實現方法以及應用場景。文章首先介紹了決策樹的基礎知識&#xff0c;然后詳細解析了CART算法的工作機制&#xff0c;包括特征選擇和樹的構建。接著&#xff0c;通過Python和PyTorch的實例代碼展示了CAR…

livox 半固體激光雷達 gazebo 仿真 | 更換仿真中mid360雷達外形

livox 半固體激光雷達 gazebo 仿真 | 更換仿真中mid360雷達外形 livox 半固體激光雷達 gazebo 仿真 | 更換仿真中mid360雷達外形livox 介紹更換仿真中mid360雷達外形 livox 半固體激光雷達 gazebo 仿真 | 更換仿真中mid360雷達外形 livox 介紹 覽沃科技有限公司&#xff08;L…

雙11后觀察:中國電商產業帶的數字新敘事

在電商平臺走過的第十五個雙11后&#xff0c;產業帶的數字化藍圖也更加完整。但在電商平臺與產業帶相互補足的背景下&#xff0c;一個更值得思考的問題是&#xff0c;隨著電商平臺的低價競爭愈演愈烈&#xff0c;產業帶上的供應鏈能力能否跟上&#xff1f; 作者|思杭 編輯|皮…

MEXC將上線UPCX(UPC)并開啟Launchpad活動

據官方公告&#xff0c;MEXC將上線UPCX項目的原生代幣UPC。上幣時間為2023-11-29 20:00 (UTC8)&#xff0c;開通UPC/USDT 交易對。 代幣名稱&#xff1a;UPCX (UPC) 總供應量&#xff1a;780,000,000 UPC 分配給 MEXC Launchpad 的代幣&#xff1a;100,000 UPC 代幣銷售形式&a…

【GCC】2:chatgpt:SendSideBandwidthEstimation

webrtc中SendSideBandwidthEstimation類的設計 The SendSideBandwidthEstimation class in WebRTC is a critical component in its video engine. It’s responsible for deciding the video traffic rate that can be sent without overloading the network and thus maintai…

分享5款經過時間驗證的精品軟件

? 今天來給大家推薦5款良心軟件,每款都是經過時間檢驗的精品,用起來讓你的工作效率提升飛快&#xff0c;各個都讓你覺得相見恨晚&#xff01; 1.文件夾隱藏工具——文件夾隱藏精靈 ? 文件夾隱藏精靈是一款可以隱藏你的文件夾和文件的工具&#xff0c;它可以讓你的隱私和重要…

NetApp ONTAP 數據安全解決方案,增強數據保護和安全性,同時提高數據治理與合規性

NetApp ONTAP 可幫助您創建智能、強大且值得信賴的存儲基礎架構&#xff0c;這種架構有助于降低成本、加快關鍵工作負載的運行速度、保護和保障混合云中的數據安全。 一、為什么選擇 NetApp ONTAP 數據安全解決方案&#xff1f; 全面保護企業最寶貴的資產 眾所周知&#xff…

Android:Google三方庫之Adjust集成詳細步驟

通過 Adjust 安卓 SDK&#xff0c;您可以在自己的安卓應用中跟蹤歸因、事件及更多數據。請按照本指南中說明的步驟操作&#xff0c;在應用內設置 Adjust SDK 1、添加依賴 //adjustimplementation("com.adjust.sdk:adjust-android:4.33.5")implementation("com.…

Aop面向切面實現開發日志收集打印一文輕松搞定,內附詳細圖文示例+源碼自取

目錄 介紹 動態代理 jdk動態代理 cglib動態代理 注解實現Aop 添加必須依賴 添加Atm類 (主業務邏輯代碼塊) 定義打印log方法(提取公共代碼邏輯塊) 啟用代理 切點表達式 Aop通知類型 前置通知(Before) 后置通知(After) 正常結束通知(AfterReturning) 異常結束通知…

樹莓派上使用Nginx通過內網穿透實現無公網IP訪問內網本地站點

前言 安裝 Nginx&#xff08;發音為“engine-x”&#xff09;可以將您的樹莓派變成一個強大的 Web 服務器&#xff0c;可以用于托管網站或 Web 應用程序。相比其他 Web 服務器&#xff0c;Nginx 的內存占用率非常低&#xff0c;可以在樹莓派等資源受限的設備上運行。同時結合c…

XTU OJ 1146 矩陣乘法學習筆記

原題 題目描述 給你兩個矩陣A(n*k),B(k*m),請求A*B。 輸入 第一行是一個整數K&#xff0c;表示樣例的個數。 每個樣例包含兩個矩陣A和B。 每個矩陣的第一行是兩個整數n,m,(1≤n,m≤10)表示矩陣的行和列 以后的n行&#xff0c;每行m個整數&#xff0c;每個整數的絕對值不超過…