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

简介: 通过以上的方式,可以优雅地在Java中实现异步回调并将结果返回给前端,大大提升了应用程序的响应能力和用户体验。

在Java Web开发中,异步回调是一种常见的需求,允许服务端在完成耗时任务后能够及时地将结果返回给前端页面,提升用户体验。实现这一目标常用的方法是采用Spring框架中的异步支持,特别是 DeferredResultCompletableFuture。以下分别介绍这两种实现方式。

使用DeferredResult

DeferredResult是Spring MVC的一部分,它能够处理在另一个线程中生成的结果。对于Servlet容器来说,这意味着响应可以在稍后的任何时间里被发送,而不是立即。

Controller层

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.async.DeferredResult;

@RestController
public class AsyncController {

    @GetMapping("/async-call")
    public DeferredResult<String> executeSlowTask() {
        DeferredResult<String> output = new DeferredResult<>();

        // 模拟一个长时间运行的任务
        new Thread(() -> {
            try {
                // 模拟耗时操作
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 设置DeferredResult的结果,这会返回给客户端
            output.setResult("任务执行完成");
        }).start();

        return output;
    }
}

在上面的代码中,当 executeSlowTask被调用时,它会返回一个 DeferredResult对象给client并立刻释放Servlet容器线程。当耗时任务完成后,setResult方法被调用,Servlet容器会发送响应到客户端。

使用CompletableFuture

CompletableFuture是Java 8中引入的,是对Future的增强,允许你以异步的方式执行任务,并且以回调的方式处理结果。

Controller层

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AsyncController {

    @GetMapping("/async-call")
    public CompletableFuture<String> executeSlowTask() {
        return CompletableFuture.supplyAsync(() -> {
            // 模拟耗时操作
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return "任务执行完成";
        });
    }
}

在上面的代码中,CompletableFuture.supplyAsync会在一个独立的线程中执行传入的Lambda表达式,并返回一个 CompletableFuture实例。当耗时操作完成时,该实例会自动完成,结果会被发送给客户端。

总结

这两种方法都为处理长期运行的后端进程提供了良好的解决方案。实现过程中要特别注意的是,这种异步处理方式需要有足够的线程来支持,否则还是会遇到性能瓶颈。正确地使用线程池来管理线程是解决这个问题的关键。

在前端,你可以使用Ajax或Fetch API发起异步请求,并在回调函数中进行处理,更新用户界面。

// 示例:使用Fetch API发起异请求,并处理响应
fetch('/async-call')
  .then(response => response.text())
  .then(data => {
      console.log(data); // 处理得到的数据
      // 更新UI操作
  })
  .catch(error => console.error('Error:', error));

通过以上的方式,可以优雅地在Java中实现异步回调并将结果返回给前端,大大提升了应用程序的响应能力和用户体验。

目录
相关文章
|
6月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
401 70
|
7月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
Java
探索Java新境界!异步+事件驱动,打造响应式编程热潮,未来已来!
【8月更文挑战第30天】在现代软件开发中,系统响应性和可扩展性至关重要。Java作为主流编程语言,提供了多种机制如Future、CompletableFuture及事件驱动编程,有效提升应用性能。本文探讨Java异步编程模型与事件驱动编程,并介绍响应式模式,助您构建高效、灵活的应用程序。
148 3
|
8月前
|
监控 前端开发 Java
构建高效Java后端与前端交互的定时任务调度系统
通过以上步骤,我们构建了一个高效的Java后端与前端交互的定时任务调度系统。该系统使用Spring Boot作为后端框架,Quartz作为任务调度器,并通过前端界面实现用户交互。此系统可以应用于各种需要定时任务调度的业务场景,如数据同步、报告生成和系统监控等。
285 9
|
9月前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
339 17
|
9月前
|
前端开发 NoSQL Java
【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
本文介绍了如何配置和启动基于Java的若依(RuoYi)项目,涵盖后端和前端的详细步骤。首先,准备Redis、MySQL以及IDE(如Idea和VS)。接着,通过GitHub获取代码并导入到IDE中,执行必要的SQL文件和配置数据库密码。然后,启动Redis并进行相关配置。最后,按照前端配置步骤克隆前端代码库,打开终端执行命令完成前端配置。整个过程详细记录了每一步的操作,帮助开发者顺利部署若依项目。 如果你觉得有帮助,请点赞、关注和收藏,这将是我持续分享的动力!
3975 4
|
12月前
|
JSON 前端开发 Java
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
文章介绍了Java后端如何使用Spring Boot框架响应不同格式的数据给前端,包括返回静态页面、数据、HTML代码片段、JSON对象、设置状态码和响应的Header。
472 2
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
|
12月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
139 1
|
11月前
|
JavaScript Java 中间件
Java CompletableFuture 异步超时实现探索
本文探讨了在JDK 8中`CompletableFuture`缺乏超时中断任务能力的问题,提出了一种异步超时实现方案,通过自定义工具类模拟JDK 9中`orTimeout`方法的功能,解决了任务超时无法精确控制的问题,适用于多线程并行执行优化场景。
242 0
|
开发框架 前端开发 Java
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
【8月更文挑战第12天】SpringBootWeb极速入门-实现一个简单的web页面01
350 3
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01