异步控制器Spring MVC中的请求流

时间:2017-01-05 13:42:08

标签: spring-mvc asynchronous

我试图从一个链接中了解异步控制器的实现:

http://shengwangi.blogspot.in/2015/09/asynchronous-spring-mvc-hello-world.html

我对控制线程收到请求并存在这一点感到困惑。然后服务方法收到进一步处理的请求。

@RequestMapping("/helloAsync")
  public Callable<String> sayHelloAsync() {
    logger.info("Entering controller");

    Callable<String> asyncTask = new Callable<String>() {

      @Override
      public String call() throws Exception {
        return helloService.doSlowWork();
      }
    };

    logger.info("Leaving  controller");
    return asyncTask;
  }

因为,Controller存在它并将控制传递给适当的处理程序映射/ jsp。浏览器会在用户身上看到什么?

2 个答案:

答案 0 :(得分:1)

浏览器等待响应处理它。

异步过程仅在服务器端进行,与浏览器无关。浏览器发送请求并等待服务器写回响应。

由于您返回Callable并不意味着控制器存在流。 Spring的响应处理程序将等待异步任务执行以写回响应。

请通过AsyncHandlerMethodReturnValueHandler来处理从控制器返回的异步响应。

如果你返回callable,那么它将由CallableHandlerMethodReturnvaluehandler处理:

public void handleReturnValue(Object returnValue, MethodParameter returnType,
        ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {

    if (returnValue == null) {
        mavContainer.setRequestHandled(true);
        return;
    }

    Callable<?> callable = (Callable<?>) returnValue;
    WebAsyncUtils.getAsyncManager(webRequest).startCallableProcessing(callable, mavContainer);
}

答案 1 :(得分:1)

我从这个链接中清除了我的怀疑:

https://dzone.com/articles/jax-rs-20-asynchronous-server-and-client

但是,他们使用不同的方式来完成异步处理,但每个方法的核心概念应该是相同的。

文章的一些重要部分:

  

异步处理模型背后的想法是分开   连接接受和请求处理操作。技术上   说它意味着分配两个不同的线程,一个接受   客户端连接和另一个处理繁重和耗时   操作。在这个模型中,容器调度一个线程来接受   客户端连接(acceptor),将请求移交给处理   (工人)线程并释放一个接受器。结果将被发回   工作线程给客户端。在这个机制客户端   连接仍然开放。这样可能不会对性能产生太大影响   处理模型对服务器的 THROUGHPUT SCALABILITY 产生了很大的影响。