wordpress做論壇網(wǎng)站免費推廣網(wǎng)站排行榜
💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識,也可以暢所欲言、分享您的想法和見解。
- 推薦:kwan 的首頁,持續(xù)學(xué)習(xí),不斷總結(jié),共同進(jìn)步,活到老學(xué)到老
- 導(dǎo)航
- 檀越劍指大廠系列:全面總結(jié) java 核心技術(shù)點,如集合,jvm,并發(fā)編程 redis,kafka,Spring,微服務(wù),Netty 等
- 常用開發(fā)工具系列:羅列常用的開發(fā)工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
- 數(shù)據(jù)庫系列:詳細(xì)總結(jié)了常用數(shù)據(jù)庫 mysql 技術(shù)點,以及工作中遇到的 mysql 問題等
- 懶人運維系列:總結(jié)好用的命令,解放雙手不香嗎?能用一個命令完成絕不用兩個操作
- 數(shù)據(jù)結(jié)構(gòu)與算法系列:總結(jié)數(shù)據(jù)結(jié)構(gòu)和算法,不同類型針對性訓(xùn)練,提升編程思維,劍指大廠
非常期待和您一起在這個小小的網(wǎng)絡(luò)世界里共同探索、學(xué)習(xí)和成長。💝💝💝 ?? 歡迎訂閱本專欄 ??
博客目錄
- 一.簡單介紹
- 1.DeferredResult 簡介
- 2.功能和特性
- 二.使用方式
- 1.Controller 中的方法
- 2.異步任務(wù)完成后設(shè)置結(jié)果
- 3.自定義線程池
- 三.原理分析
- 1.Servlet 異步支持
- 2.DeferredResult 中介
- 四.注意事項
- 1.超時處理
- 2.異常處理
- 3.不適用于所有場景
一.簡單介紹
1.DeferredResult 簡介
DeferredResult
是 Spring Framework 中用于異步處理請求的一種機(jī)制。它允許將處理結(jié)果推遲到稍后的時間點,通常用于處理需要較長時間完成的操作,例如異步任務(wù)、長時間計算或外部服務(wù)調(diào)用。
2.功能和特性
-
異步處理:
DeferredResult
允許將請求的處理推遲到稍后的時間,允許應(yīng)用程序異步地處理請求。 -
非阻塞: 使用
DeferredResult
不會阻塞容器線程,這有助于提高應(yīng)用程序的吞吐量。 -
長輪詢: 可以使用
DeferredResult
實現(xiàn)長輪詢(long polling)模式,其中客戶端發(fā)送請求并在服務(wù)器端保持掛起狀態(tài),直到有數(shù)據(jù)可用。
二.使用方式
1.Controller 中的方法
Controller 中的方法: 在控制器方法中,返回類型可以是 DeferredResult<T>
,其中 T
是要返回的數(shù)據(jù)類型。
@GetMapping("/async-operation")
public DeferredResult<String> asyncOperation() {DeferredResult<String> deferredResult = new DeferredResult<>();// 在某個異步任務(wù)完成后,將結(jié)果設(shè)置到 DeferredResult 中asyncService.performAsyncOperation().whenComplete((result, throwable) -> deferredResult.setResult(result));return deferredResult;
}
2.異步任務(wù)完成后設(shè)置結(jié)果
異步任務(wù)完成后設(shè)置結(jié)果: 在異步任務(wù)完成后,通過 DeferredResult.setResult(result)
將結(jié)果設(shè)置到 DeferredResult
對象中。
public CompletableFuture<String> performAsyncOperation() {// 異步任務(wù)邏輯return CompletableFuture.supplyAsync(() -> "Async operation result");
}
3.自定義線程池
線程池:
public class ThreadPoolUntil {private static final int THREAD_POOL_SIZE = 10;private static ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);public static void executeTask(Runnable task) {executorService.submit(task);}public static void shutdown() {executorService.shutdown();}
}
controller:
@ApiOperation(value = "首頁-合計列表", nickname = "首頁-合計列表")
@PostMapping("/totalList")
public DeferredResult<Payload<List<TotalListDayDTO>>> totalList(@RequestBody TotalListQuery totalListQuery, @RequestHeader(value = "brandDetailNo") String brandDetailNo) {totalListQuery.setBrandDetailNo(brandDetailNo);DeferredResult<Payload<List<TotalListDayDTO>>> deferredResult = new DeferredResult<>(10000L);// 設(shè)置超時處理deferredResult.onTimeout(() -> deferredResult.setErrorResult(new Payload("504", "請求超時")));// 設(shè)置錯誤處理deferredResult.onError((Throwable t) -> deferredResult.setErrorResult(new Payload("500", "系統(tǒng)錯誤")));// 創(chuàng)建任務(wù)Runnable task = () -> deferredResult.setResult(new Payload(skuDataBusinessService.totalList(totalListQuery)));ThreadPoolUntil.executeTask(task);return deferredResult;
}
三.原理分析
1.Servlet 異步支持
Servlet 3.0+ 異步支持: DeferredResult
的實現(xiàn)依賴于 Servlet 3.0+ 的異步支持。在處理請求時,容器會將請求轉(zhuǎn)交給異步處理,允許處理線程在異步操作完成前釋放。
2.DeferredResult 中介
DeferredResult 作為中介: DeferredResult
充當(dāng)控制器方法和異步任務(wù)之間的中介,使得控制器方法可以在異步任務(wù)完成后設(shè)置結(jié)果。
四.注意事項
1.超時處理
超時處理: 可以設(shè)置 DeferredResult
的超時時間,如果異步操作在超時時間內(nèi)未完成,可以通過設(shè)置超時處理邏輯來處理。
deferredResult.setTimeout(5000); // 設(shè)置超時時間為5秒
deferredResult.onTimeout(() -> {// 處理超時邏輯deferredResult.setErrorResult("Operation timed out");
});
2.異常處理
異常處理: 需要在異步任務(wù)中捕獲可能的異常,并在 DeferredResult
中設(shè)置錯誤結(jié)果。
asyncService.performAsyncOperation().whenComplete((result, throwable) -> {if (throwable != null) {deferredResult.setErrorResult("An error occurred: " + throwable.getMessage());} else {deferredResult.setResult(result);}});
3.不適用于所有場景
不適用于所有場景: DeferredResult
適用于長時間運行的操作,但并不是適用于所有場景。對于一些簡單和快速的操作,同步處理可能更加合適。
總體而言,DeferredResult
是 Spring 中處理異步請求的強(qiáng)大工具,可以幫助改善應(yīng)用程序的性能和用戶體驗,特別是在需要處理長時間運行操作的情況下。
覺得有用的話點個贊
👍🏻
唄。
??????本人水平有限,如有紕漏,歡迎各位大佬評論批評指正!😄😄😄💘💘💘如果覺得這篇文對你有幫助的話,也請給個點贊、收藏下吧,非常感謝!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且長,行則將至,讓我們一起加油吧!🌙🌙🌙