Spring中DeferredResult異步處理
一.簡單介紹
1.DeferredResult 簡介
DeferredResult 是 Spring Framework 中用于異步處理請求的一種機制。它允許將處理結(jié)果推遲到稍后的時間點,通常用于處理需要較長時間完成的操作,例如異步任務、長時間計算或外部服務調(diào)用。
2.功能和特性
異步處理:
DeferredResult允許將請求的處理推遲到稍后的時間,允許應用程序異步地處理請求。非阻塞: 使用
DeferredResult不會阻塞容器線程,這有助于提高應用程序的吞吐量。長輪詢: 可以使用
DeferredResult實現(xiàn)長輪詢(long polling)模式,其中客戶端發(fā)送請求并在服務器端保持掛起狀態(tài),直到有數(shù)據(jù)可用。
二.使用方式
1.Controller 中的方法
Controller 中的方法: 在控制器方法中,返回類型可以是 DeferredResult<T>,其中 T 是要返回的數(shù)據(jù)類型。
@GetMapping("/async-operation")
public DeferredResult<String> asyncOperation() {
DeferredResult<String> deferredResult = new DeferredResult<>();
// 在某個異步任務完成后,將結(jié)果設置到 DeferredResult 中
asyncService.performAsyncOperation()
.whenComplete((result, throwable) -> deferredResult.setResult(result));
return deferredResult;
}
2.異步任務完成后設置結(jié)果
異步任務完成后設置結(jié)果: 在異步任務完成后,通過 DeferredResult.setResult(result) 將結(jié)果設置到 DeferredResult 對象中。
public CompletableFuture<String> performAsyncOperation() {
// 異步任務邏輯
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);
// 設置超時處理
deferredResult.onTimeout(() -> deferredResult.setErrorResult(new Payload("504", "請求超時")));
// 設置錯誤處理
deferredResult.onError((Throwable t) -> deferredResult.setErrorResult(new Payload("500", "系統(tǒng)錯誤")));
// 創(chuàng)建任務
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 充當控制器方法和異步任務之間的中介,使得控制器方法可以在異步任務完成后設置結(jié)果。
四.注意事項
1.超時處理
超時處理: 可以設置 DeferredResult 的超時時間,如果異步操作在超時時間內(nèi)未完成,可以通過設置超時處理邏輯來處理。
deferredResult.setTimeout(5000); // 設置超時時間為5秒
deferredResult.onTimeout(() -> {
// 處理超時邏輯
deferredResult.setErrorResult("Operation timed out");
});
2.異常處理
異常處理: 需要在異步任務中捕獲可能的異常,并在 DeferredResult 中設置錯誤結(jié)果。
asyncService.performAsyncOperation()
.whenComplete((result, throwable) -> {
if (throwable != null) {
deferredResult.setErrorResult("An error occurred: " + throwable.getMessage());
} else {
deferredResult.setResult(result);
}
});
3.不適用于所有場景
不適用于所有場景: DeferredResult 適用于長時間運行的操作,但并不是適用于所有場景。對于一些簡單和快速的操作,同步處理可能更加合適。
總體而言,DeferredResult 是 Spring 中處理異步請求的強大工具,可以幫助改善應用程序的性能和用戶體驗,特別是在需要處理長時間運行操作的情況下。
到此這篇關于Spring中DeferredResult異步處理的文章就介紹到這了,更多相關Spring DeferredResult異步內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot?@Transactional事務不生效排查方式
這篇文章主要介紹了SpringBoot?@Transactional事務不生效排查方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
spring?cloud?gateway限流常見算法實現(xiàn)
本文主要介紹了spring?cloud?gateway限流常見算法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-02-02

