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

java實現(xiàn)異步回調返回給前端的方法示例

 更新時間:2024年03月18日 08:21:59   作者:JaneYork  
在Java中實現(xiàn)異步回調并將結果返回給前端,通常是在Web應用開發(fā)中處理耗時操作時所采用的技術手段,以避免阻塞HTTP請求線程并提高用戶體驗,本文就來介紹一下如何實現(xiàn),感興趣的可以了解一下

在Java中實現(xiàn)異步回調并將結果返回給前端,通常是在Web應用開發(fā)中處理耗時操作時所采用的技術手段,以避免阻塞HTTP請求線程并提高用戶體驗。以下是一個簡單的例子,說明如何通過Spring WebFlux或者Servlet 3.0及以上標準的異步API配合JSON響應的方式實現(xiàn)這一目標。

示例1 - 使用Spring WebFlux(非阻塞IO)

import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;

@RestController
public class AsyncController {

    @GetMapping("/asyncTask")
    public Mono<String> asyncTask(@RequestParam("taskId") String taskId) {
        return doAsyncTask(taskId).map(result -> {
            // 這里假設doAsyncTask返回Mono對象,當異步任務完成時會填充結果
            return ResponseEntity.ok().body(result);
        });
    }

    private Mono<YourResultType> doAsyncTask(String taskId) {
        return Mono.create(sink -> {
            // 創(chuàng)建一個異步任務,在完成后回調
            someService.doSomethingAsync(taskId, new SomeCallback(sink));
        });
    }

    class SomeCallback implements AsyncCallback<YourResultType> {
        private final MonoSink<YourResultType> sink;

        public SomeCallback(MonoSink<YourResultType> sink) {
            this.sink = sink;
        }

        @Override
        public void onResult(YourResultType result) {
            // 當異步任務完成時,通過sink.success()傳遞結果
            sink.success(result);
        }

        @Override
        public void onError(Throwable error) {
            // 如果發(fā)生錯誤,通過sink.error()傳遞異常
            sink.error(error);
        }
    }
}

// 假設`YourResultType`是你異步任務的結果類型

示例2 - 使用Servlet 3.0異步API(阻塞IO但不阻塞HTTP線程)

import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns = "/asyncTask", asyncSupported = true)
public class AsyncServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        final AsyncContext asyncContext = request.startAsync();
        Thread taskRunner = new Thread(() -> {
            YourResultType result;
            try {
                // 執(zhí)行異步任務
                result = someService.doSomethingAsync(request.getParameter("taskId"));
            } catch (Exception e) {
                handleError(asyncContext, e);
                return;
            }

            // 將結果寫回響應并結束異步上下文
            writeResponse(asyncContext, result);
        });

        taskRunner.start();
    }

    private void writeResponse(AsyncContext asyncContext, YourResultType result) {
        HttpServletResponse response = (HttpServletResponse) asyncContext.getResponse();
        try {
            response.setContentType("application/json");
            response.getWriter().write(objectMapper.writeValueAsString(result));
            asyncContext.complete();
        } catch (IOException e) {
            handleError(asyncContext, e);
        }
    }

    private void handleError(AsyncContext asyncContext, Throwable error) {
        HttpServletResponse response = (HttpServletResponse) asyncContext.getResponse();
        try {
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            response.getWriter().write(error.getMessage());
            asyncContext.complete();
        } catch (IOException e) {
            // 處理寫入錯誤...
        }
    }
}

在這兩個示例中,核心思想都是啟動一個異步任務,然后在任務完成后通過某種機制(如Reactor的MonoSink或Servlet的AsyncContext)將結果返回給前端。前端可以通過AJAX請求獲取異步任務的結果,并根據(jù)返回的狀態(tài)進行相應的處理,如展示數(shù)據(jù)或更新UI。

到此這篇關于java實現(xiàn)異步回調返回給前端的方法示例的文章就介紹到這了,更多相關java 異步回調返回給前端內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中常用的四種引用類型詳解

    Java中常用的四種引用類型詳解

    Java中常用的四種引用類型,分別為,強引用、軟引用、弱引用以及虛引用,這篇文章主要為大家介紹了這四種引用的用法,需要的可以參考一下
    2023-06-06
  • 基于java類路徑classpath和包的實例講解

    基于java類路徑classpath和包的實例講解

    下面小編就為大家分享一篇基于java類路徑classpath和包的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • 深入理解Java責任鏈模式實現(xiàn)靈活的請求處理流程

    深入理解Java責任鏈模式實現(xiàn)靈活的請求處理流程

    本文詳細介紹了Java中的責任鏈模式,幫助您理解其工作原理,以及如何在代碼中實現(xiàn)。該模式可以將請求沿著處理鏈路傳遞,實現(xiàn)靈活的請求處理流程。通過本文的學習,您將獲得在Java應用程序中使用責任鏈模式的知識和技能
    2023-04-04
  • java如何根據(jù)提供word模板導出word文檔詳解

    java如何根據(jù)提供word模板導出word文檔詳解

    在日常的開發(fā)工作中,我們時常會遇到導出Word文檔報表的需求,比如公司的財務報表、醫(yī)院的患者統(tǒng)計報表、電商平臺的銷售報表等等,這篇文章主要給大家介紹了關于java如何根據(jù)提供word模板導出word文檔的相關資料,需要的朋友可以參考下
    2023-09-09
  • Java中將base64編碼字符串轉換為圖片的代碼

    Java中將base64編碼字符串轉換為圖片的代碼

    這篇文章主要介紹了Java中將base64編碼字符串轉換為圖片,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • spring boot 項目中使用thymeleaf模板的案例分析

    spring boot 項目中使用thymeleaf模板的案例分析

    這篇文章主要介紹了spring boot 項目中使用thymeleaf模板的案例分析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • JAVA實戰(zhàn)項目實現(xiàn)客戶選購系統(tǒng)詳細流程

    JAVA實戰(zhàn)項目實現(xiàn)客戶選購系統(tǒng)詳細流程

    讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實現(xiàn)一個簡單的客戶選購系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-10-10
  • Java實現(xiàn)天天酷跑小游戲完整代碼(附源碼)

    Java實現(xiàn)天天酷跑小游戲完整代碼(附源碼)

    這篇文章主要介紹了使用Java實現(xiàn)天天酷跑(附源碼),本文通過實例圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Eclipse添加servlet模板過程代碼詳解

    Eclipse添加servlet模板過程代碼詳解

    這篇文章主要介紹了Eclipse添加servlet模板過程代碼詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Java基于正則表達式實現(xiàn)查找匹配的文本功能【經典實例】

    Java基于正則表達式實現(xiàn)查找匹配的文本功能【經典實例】

    這篇文章主要介紹了Java基于正則表達式實現(xiàn)查找匹配的文本功能,結合具體實例形式分析了java正則查找、字符串遍歷、group分組相關操作技巧,需要的朋友可以參考下
    2017-04-04

最新評論