java實(shí)現(xiàn)異步回調(diào)返回給前端的方法示例
在Java中實(shí)現(xiàn)異步回調(diào)并將結(jié)果返回給前端,通常是在Web應(yīng)用開發(fā)中處理耗時(shí)操作時(shí)所采用的技術(shù)手段,以避免阻塞HTTP請(qǐng)求線程并提高用戶體驗(yàn)。以下是一個(gè)簡(jiǎn)單的例子,說(shuō)明如何通過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對(duì)象,當(dāng)異步任務(wù)完成時(shí)會(huì)填充結(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è)示例中,核心思想都是啟動(dòng)一個(gè)異步任務(wù),然后在任務(wù)完成后通過某種機(jī)制(如Reactor的MonoSink或Servlet的AsyncContext)將結(jié)果返回給前端。前端可以通過AJAX請(qǐng)求獲取異步任務(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
LinkedBlockingQueue鏈?zhǔn)阶枞?duì)列的使用和原理解析
這篇文章主要介紹了LinkedBlockingQueue鏈?zhǔn)阶枞?duì)列的使用和原理解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
springboot 使用Spring Boot Actuator監(jiān)控應(yīng)用小結(jié)
本篇文章主要介紹了springboot 使用Spring Boot Actuator監(jiān)控應(yīng)用小結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-02-02
SpringBoot內(nèi)嵌tomcat處理有特殊字符轉(zhuǎn)義的問題
這篇文章主要介紹了SpringBoot內(nèi)嵌tomcat處理有特殊字符轉(zhuǎn)義的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
SpringBoot中web模版數(shù)據(jù)渲染展示的案例詳解
憑借 Spring Framework 的模塊、與你最喜歡的工具的大量集成以及插入你自己的功能的能力,Thymeleaf 是現(xiàn)代 HTML5 JVM Web 開發(fā)的理想選擇——盡管它還有更多功能,本文重點(diǎn)給大家介紹SpringBoot中web模版數(shù)據(jù)渲染展示,需要的朋友可以參考下2022-01-01
關(guān)于java中可變長(zhǎng)參數(shù)的定義及使用方法詳解
下面小編就為大家?guī)?lái)一篇關(guān)于java中可變長(zhǎng)參數(shù)的定義及使用方法詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2016-12-12
@PathVariable注解,讓spring支持參數(shù)帶值功能的案例
這篇文章主要介紹了@PathVariable注解,讓spring支持參數(shù)帶值功能的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2021-02-02
使用apache 的FileUtils處理文件的復(fù)制等操作方式
這篇文章主要介紹了使用apache 的FileUtils處理文件的復(fù)制等操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Mybatis對(duì)MySQL if 函數(shù)的不支持問題解讀
接手項(xiàng)目后,為了實(shí)現(xiàn)多租戶功能,引入了Mybatis-plus,發(fā)現(xiàn)之前運(yùn)行正常的SQL語(yǔ)句報(bào)錯(cuò),原因是Mybatis不支持MySQL的if函數(shù),通過查詢資料,將SQL中的if函數(shù)替換為case語(yǔ)句,解決了問題2025-12-12
java對(duì)象中什么時(shí)候適合用static修飾符踩坑解決記錄
這篇文章主要為大家介紹了java對(duì)象中什么時(shí)候適合用static修飾符踩坑解決記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09

