欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring中實現(xiàn)的三種異步流式接口方法

 更新時間:2024年10月21日 11:15:41   作者:Deh0rs  
在現(xiàn)代Web開發(fā)中,接口超時是一個常見的問題,尤其是在處理耗時操作時,傳統(tǒng)的同步接口在處理長時間任務(wù)時會阻塞請求線程,從而影響系統(tǒng)的響應(yīng)能力,本文將詳細講解Spring中實現(xiàn)的三種異步流式接口方法,需要的朋友可以參考下

前言

在現(xiàn)代Web開發(fā)中,接口超時是一個常見的問題,尤其是在處理耗時操作時。傳統(tǒng)的同步接口在處理長時間任務(wù)時會阻塞請求線程,從而影響系統(tǒng)的響應(yīng)能力。Spring框架提供了多種工具來支持異步流式接口,從而有效地解決這一問題。本文將詳細講解Spring中實現(xiàn)的三種異步流式接口方法:ResponseBodyEmitter、SseEmitter和StreamingResponseBody。

一、ResponseBodyEmitter

ResponseBodyEmitter適用于需要動態(tài)生成內(nèi)容并逐步發(fā)送給客戶端的場景,例如文件上傳進度、實時日志等。使用ResponseBodyEmitter,可以在任務(wù)執(zhí)行過程中逐步向客戶端發(fā)送更新,使交互體驗更加生動和自然。

使用示例:

@GetMapping("/bodyEmitter")
public ResponseBodyEmitter handle() {
    // 創(chuàng)建一個ResponseBodyEmitter,-1代表不超時
    ResponseBodyEmitter emitter = new ResponseBodyEmitter(-1L);

    // 異步執(zhí)行耗時操作
    CompletableFuture.runAsync(() -> {
        try {
            for (int i = 0; i < 10000; i++) {
                System.out.println("bodyEmitter " + i);
                // 發(fā)送數(shù)據(jù)
                emitter.send("bodyEmitter " + i + " @ " + new Date() + "\n");
                Thread.sleep(2000);
            }
            // 完成
            emitter.complete();
        } catch (Exception e) {
            // 發(fā)生異常時結(jié)束接口
            emitter.completeWithError(e);
        }
    });

    return emitter;
}

在這個示例中,通過模擬每2秒響應(yīng)一次結(jié)果,可以看到頁面數(shù)據(jù)在動態(tài)生成。ResponseBodyEmitter的超時時間可以設(shè)置為0或-1,表示連接不會超時。如果不設(shè)置,到達默認的超時時間后連接會自動斷開。

二、SseEmitter

SseEmitter是ResponseBodyEmitter的一個子類,主要用于服務(wù)器向客戶端推送實時數(shù)據(jù),如實時消息推送、狀態(tài)更新等場景。Server-Sent Events (SSE)技術(shù)在服務(wù)器和客戶端之間打開一個單向通道,服務(wù)端響應(yīng)的不再是一次性的數(shù)據(jù)包,而是text/event-stream類型的數(shù)據(jù)流信息。

使用示例:

@GetMapping("/subSseEmitter/{userId}")
public SseEmitter sseEmitter(@PathVariable String userId) {
    log.info("sseEmitter: {}", userId);
    SseEmitter emitterTmp = new SseEmitter(-1L);
    // 將SseEmitter對象進行持久化,以便在消息產(chǎn)生時直接取出對應(yīng)的發(fā)送器
    EMITTER_MAP.put(userId, emitterTmp);

    CompletableFuture.runAsync(() -> {
        try {
            // 模擬發(fā)送數(shù)據(jù)
            SseEmitter.SseEventBuilder event = SseEmitter.event()
                .data("sseEmitter" + userId + " @ " + LocalTime.now());
            emitterTmp.send(event);
            // 這里可以添加更多的發(fā)送邏輯
        } catch (Exception e) {
            emitterTmp.completeWithError(e);
        }
    });

    return emitterTmp;
}

在客戶端,可以通過EventSource對象建立連接,并監(jiān)聽message事件來接收服務(wù)器發(fā)送的數(shù)據(jù)。

三、StreamingResponseBody

StreamingResponseBody用于將響應(yīng)體作為流來輸出,適用于需要輸出大量數(shù)據(jù)且不適合使用ResponseBodyEmitter或SseEmitter的場景。

使用示例:

@GetMapping("/streaming")
public StreamingResponseBody streaming() {
    return outputStream -> {
        // 異步執(zhí)行耗時操作
        CompletableFuture.runAsync(() -> {
            try {
                for (int i = 0; i < 10000; i++) {
                    String data = "Streaming data " + i + "\n";
                    outputStream.write(data.getBytes());
                    outputStream.flush();
                    Thread.sleep(1000);
                }
                outputStream.close();
            } catch (Exception e) {
                // 處理異常
            }
        });
    };
}

在這個示例中,通過異步執(zhí)行耗時操作,逐步將數(shù)據(jù)寫入到響應(yīng)的輸出流中。StreamingResponseBody適用于需要持續(xù)輸出數(shù)據(jù)流的場景,例如視頻流、文件下載等。

總結(jié)

通過使用ResponseBodyEmitter、SseEmitter和StreamingResponseBody,Spring框架提供了強大的異步流式接口支持,有效地解決了接口超時的問題。這些方法允許在任務(wù)執(zhí)行過程中逐步向客戶端發(fā)送更新,提高了系統(tǒng)的響應(yīng)能力和用戶體驗。根據(jù)具體的應(yīng)用場景,可以選擇合適的工具來實現(xiàn)異步流式接口。

以上就是Spring中實現(xiàn)的三種異步流式接口方法的詳細內(nèi)容,更多關(guān)于Spring異步流式接口方法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java動態(tài)獲取實現(xiàn)某個接口下所有的實現(xiàn)類對象集合

    Java動態(tài)獲取實現(xiàn)某個接口下所有的實現(xiàn)類對象集合

    今天小編就為大家分享一篇關(guān)于Java動態(tài)獲取實現(xiàn)某個接口下所有的實現(xiàn)類對象集合,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • java8如何根據(jù)list對象中的屬性過濾篩選

    java8如何根據(jù)list對象中的屬性過濾篩選

    這篇文章主要介紹了java8如何根據(jù)list對象中的屬性過濾篩選,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Spring中Service注入多個實現(xiàn)類的方法詳解

    Spring中Service注入多個實現(xiàn)類的方法詳解

    這篇文章主要介紹了Spring中Service注入多個實現(xiàn)類的方法詳解,Spring是一個開源的Java框架,用于構(gòu)建企業(yè)級應(yīng)用程序,它提供了許多功能,如依賴注入、面向切面編程、數(shù)據(jù)訪問、Web開發(fā)等,需要的朋友可以參考下
    2023-07-07
  • SpringBoot整合screw實現(xiàn)自動生成數(shù)據(jù)庫設(shè)計文檔

    SpringBoot整合screw實現(xiàn)自動生成數(shù)據(jù)庫設(shè)計文檔

    使用navicat工作的話,導(dǎo)出的格式是excel不符合格式,還得自己整理。所以本文將用screw工具包,整合到springboot的項目中便可以自動生成數(shù)據(jù)庫設(shè)計文檔,非常方便,下面就分享一下教程
    2022-11-11
  • Spring Boot Async異步執(zhí)行任務(wù)過程詳解

    Spring Boot Async異步執(zhí)行任務(wù)過程詳解

    這篇文章主要介紹了Spring Boot Async異步執(zhí)行任務(wù)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 利用Sharding-Jdbc組件實現(xiàn)分表

    利用Sharding-Jdbc組件實現(xiàn)分表

    這篇文章主要為大家詳細介紹了利用Sharding-Jdbc組件實現(xiàn)分表,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 詳解Spring系列之@ComponentScan批量注冊bean

    詳解Spring系列之@ComponentScan批量注冊bean

    本文介紹各種@ComponentScan批量掃描注冊bean的基本使用以及進階用法和@Componet及其衍生注解使用,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-02-02
  • Spring Boot 結(jié)合 aop 實現(xiàn)讀寫分離

    Spring Boot 結(jié)合 aop 實現(xiàn)讀寫分離

    這篇文章主要介紹了Spring Boot 結(jié)合 aop 實現(xiàn)讀寫分離的示例,幫助大家更好的理解和使用Spring Boot框架,感興趣的朋友可以了解下
    2020-11-11
  • Java編程實現(xiàn)beta分布的采樣或抽樣實例代碼

    Java編程實現(xiàn)beta分布的采樣或抽樣實例代碼

    這篇文章主要介紹了Java編程實現(xiàn)beta分布的采樣或抽樣實例,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Java JDBC API介紹與實現(xiàn)數(shù)據(jù)庫連接池流程

    Java JDBC API介紹與實現(xiàn)數(shù)據(jù)庫連接池流程

    JDBC是指Java數(shù)據(jù)庫連接,是一種標準Java應(yīng)用編程接口( JAVA API),用來連接 Java 編程語言和廣泛的數(shù)據(jù)庫。從根本上來說,JDBC 是一種規(guī)范,它提供了一套完整的接口,允許便攜式訪問到底層數(shù)據(jù)庫,本篇文章我們來了解JDBC API及數(shù)據(jù)庫連接池
    2022-12-12

最新評論