摘要:异步处理简介地址相关系列文章异步处理详解分析本文讲到的所有特性皆是基于的,不是基于的。用于异步返回结果,使用自己的,使用负责处理它。配置执行异步操作需要用到,这个可以在用方法来提供相关文档。
Spring MVC异步处理简介
Github地址
相关系列文章:
Servlet 3.0 异步处理详解
Servlet 3.1 Async IO分析
本文讲到的所有特性皆是基于Servlet 3.0 Async Processing的,不是基于Servlet 3.1 Async IO的。
Callable>A Callable> can be returned when the application wants to produce the return value asynchronously in a thread managed by Spring MVC.
用于异步返回结果,使用的是Spring MVC的AsyncTaskExecutor,Spring MVC使用CallableMethodReturnValueHandler负责处理它。
下面是例子CallableController:
@RestController public class CallableController { @RequestMapping("callable-hello") public Callablehello() { return () -> new SlowJob("CallableController").doWork(); } }
用浏览器访问:http://localhost:8080/callable-hello 查看返回结果。
DeferredResult>A DeferredResult> can be returned when the application wants to produce the return value from a thread of its own choosing.
用于异步返回结果,使用的是client code自己的thread,Spring MVC使用DeferredResultMethodReturnValueHandler负责处理它。
下面是例子DeferredResultController:
@RestController public class DeferredResultController { @Autowired @Qualifier("customExecutorService") private ExecutorService executorService; @RequestMapping("deferred-result-hello") public DeferredResulthello() { DeferredResult deferredResult = new DeferredResult<>(); executorService.submit(() -> { try { deferredResult.setResult(new SlowJob("DeferredResultController").doWork()); } catch (Exception e) { deferredResult.setErrorResult(e); } }); return deferredResult; } }
在这个例子里使用了ExecutorService(见ExecutorServiceConfiguration),你也可以根据实际情况采用别的机制来给DeferredResult.setResult。
用浏览器访问:http://localhost:8080/deferred-result-hello 查看返回结果。
ListenableFuture> or CompletableFuture>/CompletionStage>A ListenableFuture> or CompletableFuture>/CompletionStage> can be returned when the application wants to produce the value from a thread pool submission.
用于异步返回结果,使用client code自己的thread pool,Spring MVC使用DeferredResultMethodReturnValueHandler负责处理它。
下面是例子ListenableFutureController:
@RestController public class ListenableFutureController { @Autowired @Qualifier("customExecutorService") private ExecutorService executorService; @RequestMapping("listenable-future-hello") public ListenableFutureTaskhello() { ListenableFutureTask listenableFutureTask = new ListenableFutureTask<>( () -> new SlowJob("ListenableFutureController").doWork()); executorService.submit(listenableFutureTask); return listenableFutureTask; } }
用浏览器访问:http://localhost:8080/listenable-future-hello 查看返回结果。
下面是例子CompletionFutureController
@RestController public class CompletionFutureController { @RequestMapping("completable-future-hello") public CompletableFuturehello() { return CompletableFuture .supplyAsync(() -> new SlowJob("CompletionFutureController").doWork()); } }
用浏览器访问:http://localhost:8080/completable-future-hello 查看返回结果。
ResponseBodyEmitterA ResponseBodyEmitter can be returned to write multiple objects to the response asynchronously; also supported as the body within a ResponseEntity.
用于异步的写入多个消息,使用的是client code自己的thread,Spring MVC使用ResponseBodyEmitterReturnValueHandler负责处理它。
下面是例子ResponseBodyEmitterController
@RestController public class ResponseBodyEmitterController { @Autowired @Qualifier("customExecutorService") private ExecutorService executorService; @RequestMapping("response-body-emitter-hello") public ResponseBodyEmitter hello() { ResponseBodyEmitter emitter = new ResponseBodyEmitter(); executorService.submit(() -> { try { for (int i = 0; i < 5; i++) { String hello = new SlowJob("ResponseBodyEmitterController").doWork(); emitter.send("Count: " + (i + 1)); emitter.send(" "); emitter.send(hello); emitter.send(" "); } emitter.complete(); } catch (Exception e) { emitter.completeWithError(e); } }); return emitter; } }
用浏览器访问:http://localhost:8080/response-body-emitter-hello 查看返回结果。
SseEmitterAn SseEmitter can be returned to write Server-Sent Events to the response asynchronously; also supported as the body within a ResponseEntity.
作用和ResponseBodyEmitter类似,也是异步的写入多个消息,使用的是client code自己的thread,区别在于它使用的是Server-Sent Events。Spring MVC使用ResponseBodyEmitterReturnValueHandler负责处理它。
下面是例子SseEmitterController
@RestController public class SseEmitterController { @Autowired @Qualifier("customExecutorService") private ExecutorService executorService; @RequestMapping("sse-emitter-hello") public ResponseBodyEmitter hello() { SseEmitter emitter = new SseEmitter(); executorService.submit(() -> { try { for (int i = 0; i < 5; i++) { String hello = new SlowJob("SseEmitterController").doWork(); StringBuilder sb = new StringBuilder(); sb.append("Count: " + (i + 1)).append(". ").append(hello.replace(" ", "")); emitter.send(sb.toString()); } emitter.complete(); } catch (Exception e) { emitter.completeWithError(e); } }); return emitter; } }
用浏览器访问:http://localhost:8080/sse-emitter-hello 查看返回结果。
StreamingResponseBodyA StreamingResponseBody can be returned to write to the response OutputStream asynchronously; also supported as the body within a ResponseEntity.
用于异步write outputStream,使用的是Spring MVC的AsyncTaskExecutor,Spring MVC使用StreamingResponseBodyReturnValueHandler负责处理它。要注意,Spring MVC并没有使用Servlet 3.1 Async IO([Read|Write]Listener)。
下面是例子StreamingResponseBodyController
@RestController public class StreamingResponseBodyController { @RequestMapping("streaming-response-body-hello") public StreamingResponseBody hello() { return outputStream -> { String hello = new SlowJob("CallableController").doWork(); outputStream.write(hello.getBytes()); outputStream.flush(); }; } }
用浏览器访问:http://localhost:8080/streaming-response-body-hello 查看返回结果。
配置MVC Async AsyncTaskExecutorSpring MVC执行异步操作需要用到AsyncTaskExecutor,这个可以在用WebMvcConfigurer.configureAsyncSupport方法来提供(相关文档)。
如果不提供,则使用SimpleAsyncTaskExecutor,SimpleAsyncTaskExecutor不使用thread pool,因此推荐提供自定义的AsyncTaskExecutor。
需要注意的是@EnableAsync也需要用到AsyncTaskExecutor,不过Spring MVC和它用的不是同一个。
顺带一提,EnableAsync默认也使用SimpleAsyncTaskExecutor,可以使用AsyncConfigurer.getAsyncExecutor方法来提供一个自定义的AsyncTaskExecutor。
例子见:MvcAsyncTaskExecutorConfigurer。
InterceptorsAsyncHandlerInterceptor,使用WebMvcConfigurer.addInterceptors注册
CallableProcessingInterceptor[Adapter],使用WebMvcConfigurer.configureAsyncSupport注册
DeferredResultProcessingInterceptor[Adapter],使用WebMvcConfigurer.configureAsyncSupport注册
官方文档:Intercepting Async Requests
WebAsyncManagerWebAsyncManager是Spring MVC管理async processing的中心类,如果你可以阅读它的源码来更多了解Spring MVC对于async processing的底层机制。
参考资料Spring Web MVC Doc - Supported method return values
Spring Web MVC Doc - Asynchronous Request Processing
Spring Web MVC Doc - Configuring Asynchronous Request Processing
Configuring Spring MVC Async Threads
Spring MVC 3.2 Preview: Introducing Servlet 3, Async Support
Spring MVC 3.2 Preview: Techniques for Real-time Updates
Spring MVC 3.2 Preview: Making a Controller Method Asynchronous
Spring MVC 3.2 Preview: Adding Long Polling to an Existing Web Application
Spring MVC 3.2 Preview: Chat Sample
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70883.html
摘要:本部分示例见这个项目的分支下的中引进了基于异步请求处理的。同时主容器线程退出释放并允许处理其他请求。对的调用返回,可以被用于异步处理之上的进一步控制。 本部分示例见这个项目的 mvc 分支下的 AsyncController.java Spring MVC 3.2 中引进了基于异步请求处理的 Servlet 3。除了返回一个值,一个控制器方法现在可以返回一个java.util...
摘要:基于工厂,会有多种应用上下文的实现的模块在模块中,面向切面编程提供了丰富的支持,该模块是应用系统中开发切面的基础,可以帮助应用对象解耦。的主页安全对于许多应用都是一个非常关键的切面。 简化Java开发 JavaBean:Enterprise JavaBean、EJBJDO:Java数据对象、Java Data ObjectPOJO:Plain Old Java ObjectDI:依赖注...
摘要:简介和众多其他框架一样,它基于的设计理念,此外,它采用可松散耦合可插拔组件结构,比其他框架更具扩展性和灵活性。框架围绕核心展开,是框架的总导演,总策划,它负责截获请求并将其分派给相应的处理器处理。 springmvc简介 springmvc和众多其他web框架一样,它基于MVC的设计理念,此外,它采用可松散耦合可插拔组件结构,比其他MVC框架更具扩展性和灵活性。 springmvc通过...
摘要:探究系统登录验证码的实现后端掘金验证码生成类手把手教程后端博客系统第一章掘金转眼间时间就从月份到现在的十一月份了。提供了与标准不同的工作方式我的后端书架后端掘金我的后端书架月前本书架主要针对后端开发与架构。 Spring Boot干货系列总纲 | 掘金技术征文 - 掘金原本地址:Spring Boot干货系列总纲博客地址:http://tengj.top/ 前言 博主16年认识Spin...
阅读 1612·2021-09-22 10:02
阅读 1884·2021-09-02 15:40
阅读 2809·2019-08-30 15:55
阅读 2190·2019-08-30 15:44
阅读 3556·2019-08-30 13:18
阅读 3190·2019-08-30 11:00
阅读 1900·2019-08-29 16:57
阅读 488·2019-08-29 16:41