2017-01-05 4 views
0

Я пытался понять реализацию асинхронного контроллера с одной из ссылок:Поток запросов в асинхронном контроллер Spring MVC

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; 
    } 

Поскольку контроллер существует и передает управление соответствующему сопоставлению обработчика/jsp. Что будет видно в браузере для пользователя?

ответ

1

Браузер ждет ответа, чтобы обработать его.

Асинхронный процесс происходит только на стороне сервера и не имеет никакого отношения к браузеру. Браузер отправляет запрос и ждет ответа сервера на ответ.

Поскольку вы вернули Callable, это не означает, что контроллер существует поток. Обработчики откликов Spring будут ждать, пока задача async будет выполнена, чтобы написать ответ.

Пройдите через AsyncHandlerMethodReturnValueHandler, который обрабатывает асинхронный ответ, возвращаемый контроллером.

если вы возвращаете вызываемая, то он будет обрабатываться 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); 
} 
+0

Вы можете указать некоторые ссылки для обоснования своего ответа? Я googled, но не мог найти ответы на него. Спасибо за Ваш ответ. – Ankit

+0

вы можете пройти этот метод CallableMethodReturnValueHandler и попробовать отладки, а также обновить ответ – Barath

1

я очистил свое сомнение по этой ссылке:

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

Однако они использовали другой способ достижения асинхронная обработка, но основная концепция должна быть одинаковой для каждого подхода.

Некоторые важные части статьи:

Идея асинхронной модели обработки является разделение соединение приема и операции обработки запроса. Технически Говоря это означает выделение двух разных потоков, один для принятия клиентского соединения , а другой для обработки тяжелых и трудоемких операций . В этой модели контейнер отправил поток, чтобы принять клиентское соединение (акцептор), передать запрос на обработку (рабочий) поток и освободить акцепторный. Результат отправляется обратно клиенту рабочим потоком. В этом случае соединение клиента остается открытым. Не может повлиять на производительность настолько, что воздействует на модель модели на сервер THROUGHPUT и СКОРОСТЬ много.

Смежные вопросы