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

Spring中DeferredResult異步處理

 更新時間:2023年12月06日 09:29:53   作者:檀越劍指大廠  
DeferredResult是Spring中處理異步請求的強大工具,可以幫助改善應用程序的性能和用戶體驗,本文就來介紹一下Spring中DeferredResult異步處理,感興趣的可以了解一下

一.簡單介紹

1.DeferredResult 簡介

DeferredResult 是 Spring Framework 中用于異步處理請求的一種機制。它允許將處理結果推遲到稍后的時間點,通常用于處理需要較長時間完成的操作,例如異步任務、長時間計算或外部服務調用。

2.功能和特性

  • 異步處理: DeferredResult 允許將請求的處理推遲到稍后的時間,允許應用程序異步地處理請求。

  • 非阻塞: 使用 DeferredResult 不會阻塞容器線程,這有助于提高應用程序的吞吐量。

  • 長輪詢: 可以使用 DeferredResult 實現(xiàn)長輪詢(long polling)模式,其中客戶端發(fā)送請求并在服務器端保持掛起狀態(tài),直到有數據可用。

二.使用方式

1.Controller 中的方法

Controller 中的方法: 在控制器方法中,返回類型可以是 DeferredResult<T>,其中 T 是要返回的數據類型。

@GetMapping("/async-operation")
public DeferredResult<String> asyncOperation() {
    DeferredResult<String> deferredResult = new DeferredResult<>();

    // 在某個異步任務完成后,將結果設置到 DeferredResult 中
    asyncService.performAsyncOperation()
                .whenComplete((result, throwable) -> deferredResult.setResult(result));

    return deferredResult;
}

2.異步任務完成后設置結果

異步任務完成后設置結果: 在異步任務完成后,通過 DeferredResult.setResult(result) 將結果設置到 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+ 的異步支持。在處理請求時,容器會將請求轉交給異步處理,允許處理線程在異步操作完成前釋放。

2.DeferredResult 中介

DeferredResult 作為中介: DeferredResult 充當控制器方法和異步任務之間的中介,使得控制器方法可以在異步任務完成后設置結果。

四.注意事項

1.超時處理

超時處理: 可以設置 DeferredResult 的超時時間,如果異步操作在超時時間內未完成,可以通過設置超時處理邏輯來處理。

deferredResult.setTimeout(5000); // 設置超時時間為5秒
deferredResult.onTimeout(() -> {
    // 處理超時邏輯
    deferredResult.setErrorResult("Operation timed out");
});

2.異常處理

異常處理: 需要在異步任務中捕獲可能的異常,并在 DeferredResult 中設置錯誤結果。

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異步內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java Servlet中Response對象的使用方法

    Java Servlet中Response對象的使用方法

    本文介紹了Java Servlet中Response對象的使用方法,包括設置響應頭、設置響應編碼、向客戶端發(fā)送數據、重定向等操作,同時介紹了常用的響應狀態(tài)碼和響應類型,幫助讀者更好地理解和掌握Servlet中Response對象的用法
    2023-05-05
  • Java中包和導包、Scanner類、輸入源的詳細講解

    Java中包和導包、Scanner類、輸入源的詳細講解

    包是Java中用來組織類和接口的一種機制,通過使用包,可以避免命名沖突,同時也方便管理代碼結構,這篇文章主要介紹了Java中包和導包、Scanner類、輸入源的詳細講解,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-08-08
  • Java正則驗證IP的方法實例分析【測試可用】

    Java正則驗證IP的方法實例分析【測試可用】

    這篇文章主要介紹了Java正則驗證IP的方法,結合實例形式對比分析了網上常見的幾種針對IP的正則驗證方法,最終給出了一個比較靠譜的IP正則驗證表達式,需要的朋友可以參考下
    2017-08-08
  • Java中接口的多態(tài)詳解

    Java中接口的多態(tài)詳解

    大家好,本篇文章主要講的是Java中接口的多態(tài)詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • SpringBoot:JPA + AuditingEntityListener時區(qū)設置方式

    SpringBoot:JPA + AuditingEntityListener時區(qū)設置方式

    這篇文章主要介紹了SpringBoot:JPA + AuditingEntityListener時區(qū)設置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 詳解Java8新特性之interface中的static方法和default方法

    詳解Java8新特性之interface中的static方法和default方法

    這篇文章主要介紹了Java8新特性之interface中的static方法和default方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • IDEA整合SSM框架實現(xiàn)網頁上顯示數據

    IDEA整合SSM框架實現(xiàn)網頁上顯示數據

    最近做了個小項目,該項目包在intellij idea中實現(xiàn)了ssm框架的整合以及實現(xiàn)訪問,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • macOS上使用gperftools定位Java內存泄漏問題及解決方案

    macOS上使用gperftools定位Java內存泄漏問題及解決方案

    這篇文章主要介紹了macOS上使用gperftools定位Java內存泄漏問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot項目打成War包部署的方法步驟

    SpringBoot項目打成War包部署的方法步驟

    這篇文章主要介紹了springboot項目如何打war包流程的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • SpringBoot熱部署Springloaded實現(xiàn)過程解析

    SpringBoot熱部署Springloaded實現(xiàn)過程解析

    這篇文章主要介紹了SpringBoot熱部署Springloaded實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03

最新評論

齐河县| 大关县| 光泽县| 阳江市| 临邑县| 甘泉县| 西贡区| 浦县| 太谷县| 南郑县| 萍乡市| 乌兰县| 武宁县| 安义县| 加查县| 阜平县| 曲阳县| 凤山市| 丰原市| 富蕴县| 龙川县| 长寿区| 陆河县| 绥棱县| 靖安县| 大田县| 东乡族自治县| 山东| 英德市| 额济纳旗| 北票市| 仁怀市| 绵竹市| 平陆县| 宁乡县| 玉田县| 石城县| 揭西县| 彝良县| 哈密市| 吉木乃县|