В Spring Boot (Spring MVC) запросы синхронизируются по умолчанию. Поток отвечает за прошлое и конец запроса. Во многих случаях, чтобы повысить пропускную способность, некоторые операции должны быть асинхронизированы. В дополнение к некоторой трудоемкой бизнес-логике, которая может быть асинхронизирована, наш интерфейс запроса также может быть выполнен асинхронно.
Запрос на службу получен потоком из веб-контейнера, такой как поток HTTP-NIO-8084-EXEC-1
Мы можем использовать Webasynctask для распространения этого запроса в новом потоке для выполнения, а HTTP-NIO-8084-EXEC-1 может получить обработку других запросов. После того, как Webasynctask возвращает данные, они будут вызваны и обработаны снова, и значение будет возвращено в запрашивающую сторону асинхронным образом.
Пример кода заключается в следующем:
@Requestmapping (value = "/login", method = requestMethod.get) public webasynctask <dityandView> longtimeTask () {System.out.println ("/login называется идентификатор потока:" + thread.currentThread (). GetName ()); Callable <dolidayAndView> callable = new Callable <delloadAndView> () {public modelAndView call () throws exection {thread.sleep (1000); /Имитировать долгосрочные задачи ModelAndView mav = new ModelAndView ("Login/Index"); System.out.println ("Успешное выполнение идентификатор потока is:" + thread.currentThread (). GetName ()); вернуть мав; }}; вернуть новый WebAsynctask <dellowandView> (Callable);}Вы можете увидеть результат вывода следующим образом:
/login называется идентификатор потока: http-nio-8084-exec-1
Выполнение успешно идентификатор потока: mvcasync1
Поток перед выполнением бизнес -логики и потока, который специально занимается бизнес -логикой, не совпадают, что достигает нашей цели.
Затем я сделал одновременный тест и обнаружил, что постоянно создавал поток MVCASYNC1. Я думал, разве пул ниток не используется?
Прочитав исходный код, я обнаружил, что это правда. Webasyncmanager является центральным классом Spring MVC для управления асинхронной обработкой.
По умолчанию используется SimpleAsynctaskexeCutor, который создаст новый поток для каждого запроса.
private asynctaskexecutor taskexecutor = new Simpleasynctaskexecutor (this.getClass (). getSiMplename ());
Если задача указывает исполнителя, используйте задачу, указывающая ее. Если это не так, используйте SimpleAsyNctAskeCutor по умолчанию
Asynctaskexecutor executor = webasynctask.getexecutor (); if (Executor! = Null) {this.taskexecutor = Executor;}Мы можем настроить пул потоков Async, не указав его отдельно для каждой задачи
Укажите by configururer.settaskexecutor (threadpooltaskexecutor ());
Импорт org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.scheduling.concurrent.threadpooltaskexecutor; importcrameSpertorportorportorportorportorportorportorportorportorportorportorportor.timemportorportor.timemportorportor.timemportorportor.timemportorportor. org.springframework.web.servlet.config.annotation.asyncsupportConfigurer; import org.springframework.web.servlet.config.annotation.webmvcconfigurationsupport ConfiguruReasyNcSupport (Final AsyncSupportConfigurer configure) {configururer.setDefaulttimeout (60 * 1000L); configururer.registerCallableInterceptors (timeoutInterceptor ()); configururer.settaskexecutor (threadpooltaskexecutor ()); } @Bean Public TimeOutCallableProcessingInterceptor TimeoutInterceptor () {return New TimeOutCallableProcessingInterceptor (); } @Bean public threadpooltaskexecutor threadpooltaskexecutor () {threadpooltaskexecutor t = new ThreadpooltaskexeCutor (); t.setCorePoolsize (10); t.setMaxPoolsize (50); t.setThreadnamePrefix ("yjh"); возврат t; }}После конфигурации вы можете видеть, что имя выходного потока начинается с YJH, и новые потоки не будут создаваться постоянно.
Вы можете увидеть результат вывода следующим образом:
/login называется идентификатор потока: HTTP-NIO-8084-EXEC-1 Выполнение успешно идентификатор потока: YJH1
Суммировать
Выше приведено то, что редактор, представленный в Spring Boot, использует webasynctask для асинхронного возврата результатов. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!