java實(shí)現(xiàn)異步回調(diào)返回給前端的方法示例
在Java中實(shí)現(xiàn)異步回調(diào)并將結(jié)果返回給前端,通常是在Web應(yīng)用開發(fā)中處理耗時(shí)操作時(shí)所采用的技術(shù)手段,以避免阻塞HTTP請求線程并提高用戶體驗(yàn)。以下是一個(gè)簡單的例子,說明如何通過Spring WebFlux或者Servlet 3.0及以上標(biāo)準(zhǔn)的異步API配合JSON響應(yīng)的方式實(shí)現(xiàn)這一目標(biāo)。
示例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 -> { // 這里假設(shè)doAsyncTask返回Mono對象,當(dāng)異步任務(wù)完成時(shí)會填充結(jié)果 return ResponseEntity.ok().body(result); }); } private Mono<YourResultType> doAsyncTask(String taskId) { return Mono.create(sink -> { // 創(chuàng)建一個(gè)異步任務(wù),在完成后回調(diào) 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) { // 當(dāng)異步任務(wù)完成時(shí),通過sink.success()傳遞結(jié)果 sink.success(result); } @Override public void onError(Throwable error) { // 如果發(fā)生錯(cuò)誤,通過sink.error()傳遞異常 sink.error(error); } } } // 假設(shè)`YourResultType`是你異步任務(wù)的結(jié)果類型
示例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í)行異步任務(wù) result = someService.doSomethingAsync(request.getParameter("taskId")); } catch (Exception e) { handleError(asyncContext, e); return; } // 將結(jié)果寫回響應(yīng)并結(jié)束異步上下文 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) { // 處理寫入錯(cuò)誤... } } }
在這兩個(gè)示例中,核心思想都是啟動一個(gè)異步任務(wù),然后在任務(wù)完成后通過某種機(jī)制(如Reactor的MonoSink或Servlet的AsyncContext)將結(jié)果返回給前端。前端可以通過AJAX請求獲取異步任務(wù)的結(jié)果,并根據(jù)返回的狀態(tài)進(jìn)行相應(yīng)的處理,如展示數(shù)據(jù)或更新UI。
到此這篇關(guān)于java實(shí)現(xiàn)異步回調(diào)返回給前端的方法示例的文章就介紹到這了,更多相關(guān)java 異步回調(diào)返回給前端內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于java類路徑classpath和包的實(shí)例講解
下面小編就為大家分享一篇基于java類路徑classpath和包的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01深入理解Java責(zé)任鏈模式實(shí)現(xiàn)靈活的請求處理流程
本文詳細(xì)介紹了Java中的責(zé)任鏈模式,幫助您理解其工作原理,以及如何在代碼中實(shí)現(xiàn)。該模式可以將請求沿著處理鏈路傳遞,實(shí)現(xiàn)靈活的請求處理流程。通過本文的學(xué)習(xí),您將獲得在Java應(yīng)用程序中使用責(zé)任鏈模式的知識和技能2023-04-04java如何根據(jù)提供word模板導(dǎo)出word文檔詳解
在日常的開發(fā)工作中,我們時(shí)常會遇到導(dǎo)出Word文檔報(bào)表的需求,比如公司的財(cái)務(wù)報(bào)表、醫(yī)院的患者統(tǒng)計(jì)報(bào)表、電商平臺的銷售報(bào)表等等,這篇文章主要給大家介紹了關(guān)于java如何根據(jù)提供word模板導(dǎo)出word文檔的相關(guān)資料,需要的朋友可以參考下2023-09-09Java中將base64編碼字符串轉(zhuǎn)換為圖片的代碼
這篇文章主要介紹了Java中將base64編碼字符串轉(zhuǎn)換為圖片,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03spring boot 項(xiàng)目中使用thymeleaf模板的案例分析
這篇文章主要介紹了spring boot 項(xiàng)目中使用thymeleaf模板的案例分析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09JAVA實(shí)戰(zhàn)項(xiàng)目實(shí)現(xiàn)客戶選購系統(tǒng)詳細(xì)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)簡單的客戶選購系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-10-10Java實(shí)現(xiàn)天天酷跑小游戲完整代碼(附源碼)
這篇文章主要介紹了使用Java實(shí)現(xiàn)天天酷跑(附源碼),本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Java基于正則表達(dá)式實(shí)現(xiàn)查找匹配的文本功能【經(jīng)典實(shí)例】
這篇文章主要介紹了Java基于正則表達(dá)式實(shí)現(xiàn)查找匹配的文本功能,結(jié)合具體實(shí)例形式分析了java正則查找、字符串遍歷、group分組相關(guān)操作技巧,需要的朋友可以參考下2017-04-04