DeferredResult解决了什么问题

DeferredResult是Spring基于Servlet 3.0的异步请求支持,旨在提高并发能力和实现长轮询。它适用于服务端消息推送、增加系统吞吐量等场景。通过设置返回类型为DeferredResult并配合业务线程池,处理IO型或高RT请求,从而释放Tomcat连接线程。当业务处理完成后,通过setResult方法将结果回调,或者在超时时触发处理。尽管DeferredResult可以缓解容器连接压力,但其性能提升取决于服务器资源分配。此外,它简化了服务端到客户端的主动消息推送实现。
摘要由CSDN通过智能技术生成

一、概念与背景

Servlet3.0提供了异步处理请求的特性,DeferredResult 是spring基于 Servlet 3.0 对异步请求的支持实现,目的是对于请求提供异步处理方式,释放容器连接,支持更多的并发。或者基于它的超时机制来做一些长轮训相关的事情。

二、应用场景

1.服务端消息推送

  • apollo配置变更,客户端通过长轮训请求服务端,服务端通过DeferredResult实现变更通知
  • 消息推送,对于一些服务端发生变更,需要向客户端发送消息通知的场景,不管是C/S还是B/S模式,也可以通过DeferredResult来实现

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做了什么事情。

  • 接收到请求后,将请求暂存并且释放容器线程,用来接收新的请求
  • 容器超时逻辑和业务正常处理逻辑将结果塞到DeferredResult返回调用

spring对于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 {
                  //省略...
                  //2.异步处理逻辑
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值