返回顶部
首页 > 资讯 > 精选 >SpringMVC异步处理的方法有哪些
  • 492
分享到

SpringMVC异步处理的方法有哪些

2023-06-06 16:06:45 492人浏览 泡泡鱼
摘要

这篇文章主要介绍springMVC异步处理的方法有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!异步处理 demo如果要启用异步返回,需要开启 @EnableAsync。如下的代码中,使用 DeferredRes

这篇文章主要介绍springMVC异步处理的方法有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

异步处理 demo

如果要启用异步返回,需要开启 @EnableAsync。如下的代码中,使用 DeferredResult 进行异步处理。

请求进来后,首先创建 DeferredResult 对象,设置超时时间为 60 秒。然后指定DeferredResult 在异步完成和等待超时时的回调。同步的处理只需要创建异步任何,然后返回DeferredResult 即可。这样 spring mvc 处理完此次请求后,不会立即返回 response 给客户端,会一直等待DeferredResult 处理完成。如果DeferredResult 没有在 60 秒内处理完成,就会触发超时,然后返回 response 给客户端。

@RequestMapping(value = "/async/demo")public DeferredResult<String> async(){ // 创建 DeferredResult,设置超时时间 60s DeferredResult<String> deferredResult = new DeferredResult<>((long)60 * 1000); String uuid = UUID.randomUUID().toString(); Runnable callback = () -> manager.remove(deferredResult, uuid); // 设置完成和超时的回调 deferredResult.onCompletion(callback); deferredResult.onTimeout(callback); // 创建异步任务 manager.addAsyncTask(deferredResult, uuid); // 同步返回 DeferredResult return deferredResult;}

对于异步任务来说,需要持有DeferredResult 对象。在异步处理结束时,需要手动调用DeferredResult.setResult完成输出。调用setResult 时,数据输出写到客户端,然后触发异步完成事件执行回调。

task.getDeferredResult().setResult(ConfigJSONUtils.tojsonString(map));

使用 DeferredResult 进行异步处理

DeferredResult 这个类代表延迟结果。DeferredResult 可以用在异步任务中,其他线程能够获取DeferredResult并设置DeferredResult 的返回数据。通常可以使用线程池、队列等配合DeferredResult 实现异步处理。

根据官方描述,Spring MVC 处理流程如下:

  1. 把 controller 返回的 DeferredResult 保存在内存队列或集合当中;

  2. Spring MVC 调用 request.startAsync(),开启异步;

  3. DispatcherServlet 和所有的 Filter 退出当前请求线程;

  4. 业务应用在异步线程中设置 DeferredResult 的返回值, Spring MVC 会再次发送请求;

  5. DispatcherServlet 再次被调用,并使用 DeferredResult 的返回值;

使用 Callable 进行异步处理

使用 Callable 进行异步处理与 DeferredResult 类似。不同的是,Callable 会交给系统指定的 TaskExecutor 执行。

根据官方描述,Spring MVC 处理流程如下:

  1. controller 返回 Callable ;

  2. Spring MVC 调用 request.startAsync(),开启异步,提交 Callable 到一个任务线程池 ;

  3. DispatcherServlet 和所有的 Filter 退出当前请求线程;

  4. 业务应用在异步线程中 返回值, Spring MVC 会再次发送请求;

  5. DispatcherServlet 再次被调用,并使用 Callable 的返回值;

@RequestMapping(value = "/async/demo")public Callable<String> async(){ Callable<String> callable = () -> String.valueOf(System.currentTimeMillis()); // 同步返回 return callable;}

使用 ListenableFuture 进行异步处理

ListenableFuture 作为返回值,与DeferredResult 类似。也需要使用者自行处理异步线程,但不支持超时、完成回调,需要自行处理。

@RequestMapping(value = "/async/demo")public ListenableFuture<String> async(){ ListenableFutureTask<String> ListenableFuture= new ListenableFutureTask<>(() -> {  return String.valueOf(System.currentTimeMillis()); }); Executors.newSingleThreadExecutor().submit(ListenableFuture); return ListenableFuture;}

使用 ResponseBodyEmitter 进行异步处理

DeferredResult 和 Callable 都只能返回一个异步值。如果需要返回多个对象,就要使用 ResponseBodyEmitter。返回的每个对象都会被 HttpMessageConverter 处理并写回输出流。如果希望设置更多返回数据,如 header、status 等,可以把 ResponseBodyEmitter 作为 ResponseEntity 的实体数据返回。

@RequestMapping("/async/responseBodyEmitter")public ResponseBodyEmitter responseBodyEmitter(){ ResponseBodyEmitter responseBodyEmitter=new ResponseBodyEmitter(); Executors.newSingleThreadExecutor().submit(() -> {  try {   responseBodyEmitter.send("demo");   responseBodyEmitter.send("test");   responseBodyEmitter.complete();  } catch (Exception ignore) {} }); return responseBodyEmitter;}

使用 StreamingResponseBody 进行异步处理

如果希望跳过返回值的自动转换,直接把输出流写入OutputStream,可以使用 StreamingResponseBody。也可以作为 ResponseEntity 的实体数据返回。

@RequestMapping("/async/streamingResponseBody")public StreamingResponseBody streamingResponseBody(){ StreamingResponseBody streamingResponseBody = outputStream -> {  Executors.newSingleThreadExecutor().submit(() -> {   try {    outputStream.write("<html>streamingResponseBody</html>".getBytes());   } catch (IOException ignore) {}  }); }; return streamingResponseBody;}

各种处理方式的对比


 可返回次数

数据转换

回调

线程池


DeferredResult

1 次

完成、超时

自行处理

Callable

1 次

系统处理

ListenableFuture

1 次

自行处理

ResponseBodyEmitter

多次

自行处理

StreamingResponseBody

多次

自行处理

以上是“SpringMVC异步处理的方法有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: SpringMVC异步处理的方法有哪些

本文链接: https://lsjlt.com/news/247802.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringMVC异步处理的方法有哪些
    这篇文章主要介绍SpringMVC异步处理的方法有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!异步处理 demo如果要启用异步返回,需要开启 @EnableAsync。如下的代码中,使用 DeferredRes...
    99+
    2023-06-06
  • SpringBoot异步处理的方法有哪些
    小编给大家分享一下SpringBoot异步处理的方法有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!异步请求与同步请求我们先通过一张图来区分一下异步请求和同步...
    99+
    2023-06-15
  • ADO.NET数据异步处理的方法有哪些
    这篇文章主要介绍“ADO.NET数据异步处理的方法有哪些”,在日常操作中,相信很多人在ADO.NET数据异步处理的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ADO.NET数据异步处理的方法有哪些...
    99+
    2023-06-17
  • JavaScript异步处理的方式有哪些
    这篇“JavaScript异步处理的方式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2024-04-02
  • 处理异步事件的方式有哪些
    本篇内容介绍了“处理异步事件的方式有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!同步异步首先当然要先...
    99+
    2024-04-02
  • golang异常处理的方法有哪些
    在Go语言中,异常处理的方法有以下几种:1. 使用`if`语句进行错误检查:在函数调用后,使用`if`语句来检查返回值是否为错误。例...
    99+
    2023-09-27
    golang
  • java异常处理的方法有哪些
    Java中常见的异常处理方法有以下几种:1. try-catch语句:使用try块包裹可能抛出异常的代码,然后使用catch块捕获并...
    99+
    2023-09-27
    java
  • c++异常处理的方法有哪些
    在C++中,有以下几种异常处理的方法:1. try-catch语句块:使用try-catch语句块可以捕获和处理异常。在try块中编...
    99+
    2023-10-10
    c++
  • spring处理异常的方法有哪些
    Spring提供了多种处理异常的方法,包括:1. 使用@ControllerAdvice注解的类:可以全局捕获和处理Controll...
    99+
    2023-08-18
    Spring
  • redis异常处理方法有哪些
    在Redis中,可以通过以下几种方式处理异常:1. 异常捕获:在Redis操作过程中,可以使用try-catch语句来捕获异常,并在...
    99+
    2023-09-16
    redis
  • Java SpringMVC异步处理详解
    目录1、本篇内容2、看段代码,分析问题3、springmvc 中异步处理4、模拟非超时请求5、模拟超时请求6、总结1、本篇内容 本文让大家掌握 springmvc 中异步处理请求,特...
    99+
    2024-04-02
  • SpringMVC异步处理的示例分析
    这篇文章主要介绍SpringMVC异步处理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!异步处理 demo如果要启用异步返回,需要开启 @EnableAsync。如下的代码中,使用 DeferredResu...
    99+
    2023-06-17
  • java超时异常处理的方法有哪些
    Java中超时异常处理的方法有以下几种: 使用线程的interrupt()方法:在执行任务的线程中设置一个定时器,当任务执行时间...
    99+
    2023-10-26
    java
  • Java中异步转同步的方法有哪些
    今天小编给大家分享一下Java中异步转同步的方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、问题应用场景应用中通...
    99+
    2023-07-02
  • jquery异步请求的方法有哪些
    本篇内容介绍了“jquery异步请求的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • 异步加载CSS的方法有哪些
    这篇文章主要介绍“异步加载CSS的方法有哪些”,在日常操作中,相信很多人在异步加载CSS的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”异步加载CSS的方法有哪些”...
    99+
    2024-04-02
  • java实现异步的方法有哪些
    Java实现异步的方法有以下几种:1. 使用线程池:可以通过ExecutorService接口创建线程池,然后使用submit()或...
    99+
    2023-08-09
    java
  • C#处理异常的方式有哪些
    本篇内容主要讲解“C#处理异常的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#处理异常的方式有哪些”吧!关于异常,从我们一开始写代码的时候就开始伴随着我们,只不过那时还没入门,脑子...
    99+
    2023-06-22
  • Java异常的处理方式有哪些
    这篇文章主要介绍“Java异常的处理方式有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java异常的处理方式有哪些”文章能帮助大家解决问题。什么是异常?异常在我们写代码是特别常见,因为程序员大...
    99+
    2023-06-30
  • Java异常处理Throwable实现方法有哪些
    Java异常处理Throwable实现方法有以下几种方法:1. try-catch语句:使用try-catch语句可以捕获并处理异常...
    99+
    2023-08-15
    Java Throwable
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作