2016-06-18 9 views
11

Я хотел, чтобы проанализировать улучшение я могу видеть, позволяя ASync контроллеры в Spring Ботинок по сравнению с обычным контроллеромАсинхронный пружинные Контроллеры против обычных контроллеров

Так вот мой тестовый код. Один API возвращает Callable, а другой - обычный API-интерфейс контроллера. Оба API, блок для 10secs имитации длительных задач

@RequestMapping(value="/api/1",method=RequestMethod.GET) 
    public List<String> questions() throws InterruptedException{ 
     Thread.sleep(10000); 
     return Arrays.asList("Question1","Question2"); 
    } 

    @RequestMapping(value="/api/2",method=RequestMethod.GET) 
    public Callable<List<String>> questionsAsync(){ 
     return() -> { 
      Thread.sleep(10000); 
      return Arrays.asList("Question2","Question2"); 
     }; 
    } 

я создать внедренный кота с этой конфигурацией т.е. только один TOMCAT обработки резьбу:

server.tomcat.max-threads=1 
logging.level.org.springframework=debug 

ожидание для/API/1 Поскольку существует только одна нить tomcat, другой запрос не будет рассмотрен до тех пор, пока это не будет обработано после 10 секунд

Результаты: Удовлетворение ожиданий


ожидания для/API/2 Поскольку мы сразу же возвращаются вызываемым, единственный кот поток должен получить бесплатно обработать другой запрос. Callable будет внутренне запускать новый поток. Поэтому, если вы нажмете один и тот же api, он также будет принят.

Результаты: Этого не происходит, и до тех пор, пока вызываемый не исполнится полностью, дальнейший запрос не будет рассмотрен.

Вопрос Почему/api/2 не работает должным образом?

+0

Tomcat запускает threadpool, вы ошибаетесь. –

+0

@RomanC Я упоминал в вопросе, я установил threadpool tomcat, чтобы он содержал только 1 поток. – hellojava

+0

Просто, чтобы быть уверенным: какой «другой запрос» вы подаете, пока спящая весенняя нить? –

ответ

13

@DaveSyer прав,/api/2 фактически ведет себя как и ожидалось.

Предполагаю, что вы тестируете поведение с помощью веб-браузера. По крайней мере, Firefox и Chrome предотвращают одновременное одновременное обращение к одному и тому же URL. Если вы откроете 2 вкладки с помощью api/2, второй отправит запрос в приложение только после первого ответа.

Попробуйте протестировать его с помощью простой Баш скрипт, как:

curl localhost/api/2 & 
curl localhost/api/2 & 
curl localhost/api/2 & 

Он напечатает 3 ответов примерно в то же время.

+0

Вы и @DaveSyer абсолютно правы! Эта проблема происходит только в браузере, а не с помощью завитка или любого клиентского тестового инструмента. – hellojava