java实现异步回调返回给前端的方法示例

 更新时间:2024年03月18日 08:21:59   作者:JaneYork  
在Java中实现异步回调并将结果返回给前端,通常是在Web应用开发中处理耗时操作时所采用的技术手段,以避免阻塞HTTP请求线程并提高用户体验,本文就来介绍一下如何实现,感兴趣的可以了解一下

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

示例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 -> {
            // 创建一个异步任务,在完成后回调
            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) {
            // 如果发生错误,通过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 {
                // 执行异步任务
                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请求获取异步任务的结果,并根据返回的状态进行相应的处理,如展示数据或更新UI。

到此这篇关于java实现异步回调返回给前端的方法示例的文章就介绍到这了,更多相关java 异步回调返回给前端内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中条件运算符的嵌套使用技巧总结

    Java中条件运算符的嵌套使用技巧总结

    在Java中,我们经常需要使用条件运算符来进行多个条件的判断和选择,条件运算符可以简化代码,提高代码的可读性和执行效率,本文将介绍条件运算符的嵌套使用技巧,帮助读者更好地掌握条件运算符的应用,需要的朋友可以参考下
    2023-11-11
  • Spring中事务几个常见的问题解决

    Spring中事务几个常见的问题解决

    这篇文章主要介绍了Spring中事务几个常见的问题解决,事务这个概念是数据库层面的,Spring只是基于数据库中的事务进行扩展,以及提供了一些能让程序员更新方便操作事务的方式
    2022-08-08
  • 创建自定义的Java注解类的方法

    创建自定义的Java注解类的方法

    这篇文章主要介绍了创建自定义的Java注解类的方法,主要部分为创建一个带有Java类型@interface的新类型,需要的朋友可以参考下
    2015-07-07
  • java去除空格、标点符号的方法实例

    java去除空格、标点符号的方法实例

    这篇文章主要给大家介绍了关于java去除空格、标点符号的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java字符串与日期类型转换的工具类

    java字符串与日期类型转换的工具类

    这篇文章主要为大家详细介绍了java字符串与日期类型转换的工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • java线程封闭之栈封闭和ThreadLocal

    java线程封闭之栈封闭和ThreadLocal

    这篇文章主要介绍了java线程封闭之栈封闭和ThreadLocal,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Mybatis中#{}和${}传参的区别及#和$的区别小结

    Mybatis中#{}和${}传参的区别及#和$的区别小结

    这篇文章主要介绍了Mybatis中#{}和${}传参的区别及#和$的区别小结 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • MyBatis中association的基本使用方法

    MyBatis中association的基本使用方法

    在项目中某些实体类之间肯定有关键关系,比如一对一,一对多等,在hibernate中用one to one和one to many,而mybatis中就用association和collection,下面这篇文章主要给大家介绍了关于MyBatis中association基本使用方法的相关资料,需要的朋友可以参考下
    2022-09-09
  • java Zookeeper简述

    java Zookeeper简述

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。下面通过本文给大家分享java 中 zookeeper简单使用,需要的朋友参考下吧
    2021-09-09
  • SpringBoot静态资源目录访问

    SpringBoot静态资源目录访问

    今天小编就为大家分享一篇关于SpringBoot静态资源目录访问,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01

最新评论