Spring Boot (Spring MVC)에서는 요청이 기본적으로 동기화됩니다. 스레드는 요청의 과거와 끝을 담당합니다. 대부분의 경우 처리량을 개선하기 위해서는 일부 작업을 비동기로 변형해야합니다. 비동기 화 될 수있는 시간이 많이 걸리는 비즈니스 로직 외에도 쿼리 인터페이스를 비동기 적으로 실행할 수도 있습니다.
서비스 요청은 스레드 HTTP-NIO-8084-EXEC-1과 같은 웹 컨테이너의 스레드에 의해 수신됩니다.
WebAsyncTask를 사용 하여이 요청을 실행을 위해 새 스레드에 배포 할 수 있으며 HTTP-NIO-8084-EXEC-1은 다른 요청의 처리를받을 수 있습니다. WebAsyncTask가 데이터를 반환하면 다시 호출 및 처리되며 값은 비동기 방식으로 요청 측으로 반환됩니다.
샘플 코드는 다음과 같습니다.
@requestmapping (value = "/login", method = requestmethod.get) public webasynctask <modelandview> longtimetask () {system.out.println ( "/로그인은 스레드 ID라고합니다. callable <modelAndView> callable = new Callable <modelAndView> () {public modelAndView Call ()은 예외 {Thread.Sleep (1000); /장기 작업 시뮬레이션 ModelandView Mav = New ModelAndView ( "Login/Index"); System.out.println ( "실행 성공적인 스레드 ID는 다음과 같습니다. 반환 mav; }}; 새로운 webasynctask <modelandview> (호출 가능);} 반환출력 결과를 다음과 같이 볼 수 있습니다.
/로그인은 스레드 ID라고합니다. HTTP-NIO-8084-EXEC-1입니다
실행 성공적으로 스레드 ID는 다음과 같습니다. MVCASYNC1
비즈니스 로직과 비즈니스 로직을 구체적으로 다루는 스레드를 실행하기 전에 스레드는 동일하지 않으므로 목표를 달성합니다.
그런 다음 동시 테스트를 수행하여 끊임없이 MVCASYNC1 스레드를 만들고 있음을 발견했습니다. 나는 스레드 풀이 사용되지 않았습니까?
소스 코드를 읽은 후 이것이 사실이라는 것을 알았습니다. Webasyncmanager는 Spring MVC가 비동기 처리를 관리하기위한 중앙 클래스입니다.
기본값은 SimpleAsyncTaskexecutor를 사용하여 각 요청에 대해 새 스레드를 생성하는 것입니다.
Private Asynctaskexecutor taskexecutor = new simpleasynctaskexecutor (this.getClass (). getSimplename ());
작업이 집행자를 지정하면 작업을 지정합니다. 그렇지 않은 경우 기본 simpleasynctaskexecutor를 사용하십시오
asynctaskexecutor executor = webasynctask.getexecutor (); if (executor! = null) {this.taskexecutor = executor;}각 작업에 대해 별도로 지정하지 않고 Async의 스레드 풀을 구성 할 수 있습니다.
configurer.settaskexecutor (ThreadPooltasKexEcutor ())에 의해 지정;
org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.scheduling.concurrent.threadpooltaskexecutor; import org.springframework.web.context.request.async.timeoutcallableprocessinginterceptor; import org.springframework.web.servlet.config.annotation.asyncsupportconfigurer; import org.springframework.web.servlet.config.annotation.webmvcconfigurationsupport; @configurationpublic class webmvcconfig extends webmvcconfigurationsupport {@override public void configyeasyncsupport (final asyncsupportconferurer) {configer.seteupportconfer) it 1000L); configurer.registerCallableInterceptors (timeOutInterceptor ()); configurer.settaskexecutor (ThreadPooltasKexEcutor ()); } @bean public timeoutCallaballyProcessingInterceptor timeoutinterceptor () {return new timeoutCallableProcessingInterceptor (); } @Bean public ThreadPoolTasKexEcutor ThreadPooltasKexEcutor () {ThreadPoolTasKexEcutor T = New ThreadPoolTasKexEcutor (); T.setCorePoolSize (10); t.setmaxpoolsize (50); t.setThreadnamePrefix ( "yjh"); 반환 t; }}구성 후 출력 스레드 이름이 YJH로 시작되며 새 스레드가 항상 생성되지 않음을 알 수 있습니다.
출력 결과를 다음과 같이 볼 수 있습니다.
/로그인은 스레드 ID라고합니다.
요약
위의 내용은 Spring Boot에 소개 된 편집기가 WebAsyncTask를 사용하여 결과를 비동기로 반환합니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!