SpringMVC异步处理的 5 种方式示例详解

yizhihongxing

针对“SpringMVC异步处理的 5 种方式示例详解”的完整攻略,我将从以下几个方面进行详细讲解:

  1. 什么是SpringMVC异步处理
  2. SpringMVC异步处理的5种方式
  3. 异步处理方式的示例说明
  4. 总结

1. 什么是SpringMVC异步处理

在SpringMVC中,一般的请求处理是同步的,也就是说请求到达后一直会占用线程,等待响应并返回结果。但是面对一些复杂的请求时,这种同步的方式就显得捉襟见肘了,比如长时间的文件上传和下载、查询复杂耗时的SQL、查询Web Service等。因此,SpringMVC为了更好的解决适合异步处理的请求,提出了异步处理的机制,使得这些请求需要等待的时间大大缩短。

2. SpringMVC异步处理的5种方式

SpringMVC异步处理主要有以下5种方式:

  1. 使用DeferredResult
  2. 使用Callable
  3. 使用ListenableFuture
  4. 使用CompletableFuture
  5. 使用Servlet 3.0

接下来我将分别对这5种方式进行详细讲解。

2.1 使用DeferredResult

使用DeferredResult是SpringMVC提供的一种异步非阻塞返回结果的方式,通过使用它,控制器线程可以先响应并返回空的DeferredResult对象,这个DeferredResult的结果在另外一个线程中计算并设置,当计算完成后,DeferredResult会携带计算出来的结果响应客户端。

2.2 使用Callable

Callable是Java并发包提供的类,能够异步执行一个任务并返回结果,类似于Runnable,但有返回值。在SpringMVC中使用Callable的原理与DeferredResult类似,当控制器线程遇到Callable时,会先执行并返回一个Callable对象,然后再启动一个新的线程来执行Callable,返回结果后,该线程又会转回控制器线程来响应客户端请求。

2.3 使用ListenableFuture

ListenableFuture基于Guava库,与DeferredResult类似,它也能够异步处理,只是操作更加灵活。通过ListenableFuture,可以在异步执行结束后立即执行一些操作,而不用像DeferredResult一样通过回调函数来操作。

2.4 使用CompletableFuture

CompletableFuture也是Java的一个异步处理类,在Java8中引入了这个类。它相比DeferredResult和ListenableFuture更加强大,并且也支持异步触发回调函数。

2.5 使用Servlet 3.0

Servlet 3.0提供的异步处理方式相对于前面的4种方式,更加简单直接。在Servlet 3.0中,只需要给异步处理的请求设置一个AsyncContext异步上下文,便能够异步返回结果。

3. 异步处理方式的示例说明

现在,让我们通过两个示例,分别来说明两种异步处理方式:使用DeferredResult和使用CompletableFuture。

3.1 使用DeferredResult

以使用DeferredResult处理下载文件请求为例,如下:

@GetMapping("/download")
@ResponseBody
public DeferredResult<byte[]> download(final int delay) {
    final DeferredResult<byte[]> deferredResult = new DeferredResult<>(60000L);//设置60s的超时返回结果

    // 新起一个线程异步执行文件下载
    new Thread(() -> {
        try {
            byte[] fileByte = fileService.download(delay);
            //计算文件hash值
            String fileMd5 = DigestUtils.md5Hex(fileByte);
            //设置DeferredResult结果
            deferredResult.setResult(fileByte);
        } catch (Throwable t) {
            deferredResult.setErrorResult(t);
        }
    }).start();

    return deferredResult;
}

这个例子中,当用户请求下载文件时,由于文件下载的时间比较长,为了避免这个请求一直占用线程,我们就需要使用DeferredResult。实现的原理和我们前面的介绍中一样,先响应一个空DeferredResult对象,等待后续计算,计算完毕后再回调设置DeferredResult的结果。

当我们使用浏览器访问该地址时,由于异步执行文件下载,因此页面不会直接以文件形式下载,而是等待60秒,然后将下载的文件返回。

3.2 使用CompletableFuture

接下来,我们再介绍一下如何使用CompletableFuture异步处理请求。以查询Web Service为例:

@GetMapping("/webService")
@ResponseBody
public CompletableFuture<Result> callWebService() {
    return CompletableFuture.supplyAsync(() -> {
        Result result = webService.callWebService(); //调用WebService接口
        return result;
    });
}

如果Web service调用返回的结果比较缓慢,当前线程会一直阻塞,无法响应其他请求,因此我们需要使用CompletableFuture,并使用它提供的异步回调,通过新起一个线程异步调用Web service接口。

4. 总结

SpringMVC提供的异步处理机制,能够让SpringMVC更加高效地处理一些长时间等待的请求,提高系统的响应速度和效率。SpringMVC提供了5种异步处理的方式,包括使用DeferredResult、Callable、ListenableFuture、CompletableFuture和Servlet 3.0,不同的异步处理方式有不同的特点和使用场景,我们可以根据需要自行选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC异步处理的 5 种方式示例详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Java实现微信公众号发送模版消息

    Java实现微信公众号发送模版消息 发送模版消息是微信公众号开发中非常常用的功能,通过发送模版消息可以给用户提供更加丰富的服务。本文将详细讲解如何使用Java实现微信公众号发送模版消息的攻略。 准备工作 在开始之前,需要先准备好以下两个东西: 微信公众号的AppID和AppSecret; 微信模版ID。 在此不再赘述如何获取AppID和AppSecret,读…

    Java 2023年5月23日
    00
  • 推荐一个可以提高生产力的在线游戏

    很久没推荐好玩的工具了,今天给家推荐一个非常有意思的游戏:Habitica Habitica除了是个游戏之外,居然还是一个生产力应用! 为什么说Habitica还是个生产力应用呢?因为它还可以帮助我们养成习惯! 通过Habitica,我们可以用它的每日目标和代办事项列表功能来跟踪和管理你的习惯 在完成任务之后,你可以以此来升级你的虚拟角色,同时解锁游戏中更多…

    Java 2023年4月25日
    00
  • springboot整合mybatis实现数据库的更新批处理方式

    下面我为您介绍一下“springboot整合mybatis实现数据库的更新批处理方式”的完整攻略。 准备工作 在开始整合之前,需要先准备好以下环境: Java环境:在本文中使用Java 8 Maven环境:在本文中使用Maven 3 MySQL数据库环境:在本文中使用MySQL 5.7 IntelliJ IDEA集成开发环境:在本文中使用IntelliJ I…

    Java 2023年5月19日
    00
  • SpringBoot LocalDateTime格式转换方案详解(前端入参)

    针对SpringBoot LocalDateTime格式转换方案的详细攻略,我们可以分为以下几个步骤进行讲解: 1. 引入相关依赖 首先在pom.xml中引入相关依赖: <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId…

    Java 2023年6月2日
    00
  • Spring Boot构建框架详解

    SpringBoot构建框架详解 什么是SpringBoot SpringBoot是由Pivotal团队在2013年开源的一款基于Java的框架,它旨在让开发者更加便捷地创建Spring应用。SpringBoot具备自动配置、快速开发、无代码生成等特点,同时它也提供了包括Web、数据、消息等在内的一系列开发场景。 如何使用SpringBoot 1. 环境要求…

    Java 2023年5月15日
    00
  • Java日期操作方法工具类实例【包含日期比较大小,相加减,判断,验证,获取年份等】

    下面是详细讲解Java日期操作方法工具类实例的完整攻略。 一、概述 Java中日期操作是常见的需求,在很多场景中都需要对日期进行操作。Java日期操作方法工具类是为了方便Java开发者对日期进行操作而开发的一个工具类。该工具类提供了丰富的日期操作方法,包括比较大小、相加减、判断、验证、获取年份等。 二、使用方法 1. 引入工具类 首先,我们需要引入该工具类。…

    Java 2023年5月20日
    00
  • Spring Boot整合阿里开源中间件Canal实现数据增量同步

    Spring Boot整合阿里开源中间件Canal实现数据增量同步攻略 简介 Canal是阿里巴巴开源的一款数据库binlog日志解析工具,用于数据增量同步和数据订阅。本文将介绍如何将Canal与Spring Boot整合,实现数据库的增量同步。 环境准备 JDK 8+ Spring Boot Canal 操作步骤 步骤一:引入依赖 在Spring Boot…

    Java 2023年6月2日
    00
  • Java实现一个顺序表的完整代码

    要实现一个顺序表,首先需要定义一个数据结构,用于存储数据,并提供相应的操作方法。以下是一个Java实现顺序表的完整代码的攻略。 定义数据结构 定义一个类ArrayList作为顺序表的数据结构。这个类具有以下属性和方法: size:表示顺序表的元素个数。 capacity:表示顺序表的最大容量。 elements:表示顺序表的存储空间,即一个数组。 Array…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部