Servlet3.0提供了异步处理请求的特性,DeferredResult 是spring基于 Servlet 3.0 对异步请求的支持实现,目的是对于请求提供异步处理方式,释放容器连接,支持更多的并发。或者基于它的超时机制来做一些长轮训相关的事情。
1.服务端消息推送
2.增加系统吞吐量
拿tomcat作为servlet容器来说,无论是计算型请求还是io型请求,都是交给tomcat容器线程来建立连接和负责业务逻辑处理,如果将io型请求或者rt比较高的请求业务逻辑处理,通过DeferredResult来实现,那么可以尽早地释放连接线程,业务逻辑交由业务线程池处理,那么连接线程池可以接收更多的请求,从而提高了系统吞吐量。
1.编写DeferredResult返回类型api
- @GetMapping("/deferredresult/test")
- public DeferredResult<String> testDeferredResult(long sleepTime) {
- DeferredResult<String> deferredResult = new DeferredResult<>(5000L,"server side timeout");
- executorService.submit(() -> {
- try {
- Thread.sleep(sleepTime);
- deferredResult.setResult("server response successfully");
- } catch (InterruptedException e) {
- log.error("occur error",e);
- }
- });
- return deferredResult;
- }
- 复制代码
2.接口调用

这样就完成了DeferredResult异步调用,当然我们也可以在DeferredResult设置超时相关逻辑。
为了方便理解,找了一张图来看一下DeferredResult做了什么事情。

1.请求预处理
当然DeferredResult处理逻辑也脱离不了spring mvc的支持,也是要走到DispatcherServlet来处理请求:
- protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
- HttpServletRequest processedRequest = request;
- HandlerExecutionChain mappedHandler = null;
- boolean multipartRequestParsed = false;
- //1.生成异步管理器
- WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
- try {
- try {
- ModelAndView mv = null;
- Object dispatchException = null;
-
- try {
- //省略...