• java实现异步回调返回给前端


    在Java中实现异步回调并将结果返回给前端,通常是在Web应用开发中处理耗时操作时所采用的技术手段,以避免阻塞HTTP请求线程并提高用户体验。以下是一个简单的例子,说明如何通过Spring WebFlux或者Servlet 3.0及以上标准的异步API配合JSON响应的方式实现这一目标。

    示例1 - 使用Spring WebFlux(非阻塞IO)
    1. import org.springframework.web.bind.annotation.*;
    2. import reactor.core.publisher.Mono;
    3. @RestController
    4. public class AsyncController {
    5. @GetMapping("/asyncTask")
    6. public Mono<String> asyncTask(@RequestParam("taskId") String taskId) {
    7. return doAsyncTask(taskId).map(result -> {
    8. // 这里假设doAsyncTask返回Mono对象,当异步任务完成时会填充结果
    9. return ResponseEntity.ok().body(result);
    10. });
    11. }
    12. private Mono<YourResultType> doAsyncTask(String taskId) {
    13. return Mono.create(sink -> {
    14. // 创建一个异步任务,在完成后回调
    15. someService.doSomethingAsync(taskId, new SomeCallback(sink));
    16. });
    17. }
    18. class SomeCallback implements AsyncCallback<YourResultType> {
    19. private final MonoSink<YourResultType> sink;
    20. public SomeCallback(MonoSink<YourResultType> sink) {
    21. this.sink = sink;
    22. }
    23. @Override
    24. public void onResult(YourResultType result) {
    25. // 当异步任务完成时,通过sink.success()传递结果
    26. sink.success(result);
    27. }
    28. @Override
    29. public void onError(Throwable error) {
    30. // 如果发生错误,通过sink.error()传递异常
    31. sink.error(error);
    32. }
    33. }
    34. }
    35. // 假设`YourResultType`是你异步任务的结果类型
    示例2 - 使用Servlet 3.0异步API(阻塞IO但不阻塞HTTP线程)
    1. import javax.servlet.AsyncContext;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. @WebServlet(urlPatterns = "/asyncTask", asyncSupported = true)
    9. public class AsyncServlet extends HttpServlet {
    10. @Override
    11. protected void doGet(HttpServletRequest request, HttpServletResponse response)
    12. throws ServletException, IOException {
    13. final AsyncContext asyncContext = request.startAsync();
    14. Thread taskRunner = new Thread(() -> {
    15. YourResultType result;
    16. try {
    17. // 执行异步任务
    18. result = someService.doSomethingAsync(request.getParameter("taskId"));
    19. } catch (Exception e) {
    20. handleError(asyncContext, e);
    21. return;
    22. }
    23. // 将结果写回响应并结束异步上下文
    24. writeResponse(asyncContext, result);
    25. });
    26. taskRunner.start();
    27. }
    28. private void writeResponse(AsyncContext asyncContext, YourResultType result) {
    29. HttpServletResponse response = (HttpServletResponse) asyncContext.getResponse();
    30. try {
    31. response.setContentType("application/json");
    32. response.getWriter().write(objectMapper.writeValueAsString(result));
    33. asyncContext.complete();
    34. } catch (IOException e) {
    35. handleError(asyncContext, e);
    36. }
    37. }
    38. private void handleError(AsyncContext asyncContext, Throwable error) {
    39. HttpServletResponse response = (HttpServletResponse) asyncContext.getResponse();
    40. try {
    41. response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    42. response.getWriter().write(error.getMessage());
    43. asyncContext.complete();
    44. } catch (IOException e) {
    45. // 处理写入错误...
    46. }
    47. }
    48. }

    在这两个示例中,核心思想都是启动一个异步任务,然后在任务完成后通过某种机制(如Reactor的MonoSink或Servlet的AsyncContext)将结果返回给前端。前端可以通过AJAX请求获取异步任务的结果,并根据返回的状态进行相应的处理,如展示数据或更新UI。

  • 相关阅读:
    Git远程仓库
    【高并发】别闹了,这样理解Java的内存模型才正确(八种操作+同步规则)
    Docker中安装mysqld-exporter
    m基于rbf神经网络和遗传算法优化的MIMO-OFDM系统信道估计算法matlab仿真
    JAVA面试题JVM篇(一)
    【iOS开发】-UIViewController加载过程和生命周期
    简易机器学习笔记(十)Windows下 PaddlePaddle配置CUDA加速环境
    【C语言刷LeetCode】137.只出现一次的数字 II(M)
    一个简单的音乐网站设计与实现(HTML+CSS)
    .net core 和 WPF 开发升讯威在线客服系统:调用有道翻译接口实现实时自动翻译的方法
  • 原文地址:https://blog.csdn.net/qq_31708763/article/details/136739921