【问题标题】:Request Flow in Asynchronous Controller Spring MVC异步控制器 Spring MVC 中的请求流
【发布时间】:2017-01-05 13:42:08
【问题描述】:

我试图通过以下链接之一了解异步控制器的实现:

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。用户会在浏览器上看到什么?

【问题讨论】:

    标签: spring-mvc asynchronous


    【解决方案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);
    }
    

    【讨论】:

    • 你能提供一些链接来证明你的答案吗?我用谷歌搜索但找不到相关的答案。谢谢你的回答。
    • 能否请您通过此方法CallableMethodReturnValueHandler 并尝试调试并更新答案
    【解决方案2】:

    我已经通过这个链接清除了我的疑问:

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

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

    文章的一些重要部分:

    异步处理模型背后的思想是分离 连接接受和请求处理操作。技术上 说它意味着分配两个不同的线程,一个接受 客户端连接和其他处理繁重且耗时 操作。在这个模型中,容器调度了一个线程来接受 客户端连接(接受者),将请求交给处理 (工人)线程并释放接受者之一。结果被发回 由工作线程发送给客户端。在这种机制中,客户的 连接保持打开状态。可能不会对性能产生太大影响,例如 处理模型对服务器的THROUGHPUTSCALABILITY影响很大。

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 2011-02-25
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多