[SPRING] REST 컨트롤러는 멀티 스레드입니까?
SPRINGREST 컨트롤러는 멀티 스레드입니까?
비동기 호출 객체를 반환하는 방법에 대한 자습서를 작성했습니다. 의도 한대로 작동합니다. 그러나 첫 번째 요청이 5 초 동안 휴면 상태가되는 동안 두 번째 요청을 받고 컨트롤러는 두 번째 요청을 처리하기 전에 핀란드어로 이전 요청을 기다립니다.
컨트롤러가 모든 요청을 즉시 처리하고 백그라운드에서 자게하는 방법?
@편집하다
예: 상황을 상상해보십시오. 내 컨트롤러가 외부 API에 요청해야하고 응답을 기반으로하면 자체 응답을 보내야합니다. 외부 API 호출에 2 초가 소요됩니다. 컨트롤러가 한 번에 하나의 요청 만 처리 할 수 있기 때문에 내 응용 프로그램 사용자가 2.5 초 만 대기하고 대기열에 두지 않기를 바랍니다.
해결법
-
==============================
1.REST 컨트롤러는 DisptcherServlet이 클라이언트의 여러 요청을 동시에 처리하고 각각의 컨트롤러 메서드를 사용하여 멀티 스레드 처리됩니다. 여기 요청 처리 흐름을 참조 할 수 있습니다.
REST 컨트롤러는 DisptcherServlet이 클라이언트의 여러 요청을 동시에 처리하고 각각의 컨트롤러 메서드를 사용하여 멀티 스레드 처리됩니다. 여기 요청 처리 흐름을 참조 할 수 있습니다.
아래와 같이 Spring 컨트롤러 메소드에서 Callable
을 반환하면됩니다. @Controller public class MyController { @RequestMapping(value="/sleep") public Callable<String> myControllerMethod() { Callable<String> asyncTask = () -> { try { System.out.println(" WAITING STARTED:"+new Date()); Thread.sleep(5000); System.out.println(" WAITING COMPLETED:"+new Date()); return "Return";//Send the result back to View Return.jsp } catch(InterruptedException iexe) { //log exception return "ReturnFail"; }}; return asyncTask; }
산출:
대기 시작 : 11 월 24 일 21시 3 분 12 초 GMT 2016
대기 완료 : 11 월 24 일 21 : 21 : 17 GMT 2016
이 후, 뷰는 "Return.jsp"페이지로 리턴됩니다.
여기에서 컨트롤러 메소드는 별도의 스레드 (실제 서블릿 스레드 해제)에서 실행되며 작업이 완료되면 결과가 다시 클라이언트로 전송됩니다 (View 등 ..).
추신 : 응용 프로그램 구성의 일부로 @EnableAsync를 추가해야합니다. 여기에서 확인할 수 있습니다.
-
==============================
2.당신이하고 싶은 것은 당신이 링크 한 튜토리얼의 첫 번째 예에서해야 할 일입니다 :
당신이하고 싶은 것은 당신이 링크 한 튜토리얼의 첫 번째 예에서해야 할 일입니다 :
@RequestMapping(value = "/block", method = RequestMethod.GET, produces = "text/html") public String executeSlowTask() { logger.info("Request received"); Thread.sleep(5000); logger.info("Servlet thread released"); return result; }
이렇게하면 호출 스레드가 차단되고 완료 될 때까지 대기합니다. 다른 HTTP 세션에서 호출하면 다른 스레드가되므로 새로운 5 초 대기가됩니다 (첫 번째 세션의 영향을받지 않음).
스레드는 풀에서 사용할 수있는 스레드가있는 한 HTTP 호출에 연결됩니다 (Tomcat 서버 구성).
통화 중 컨트롤러가 모든 후속 통화를 차단하지는 않습니다. 다중 스레드입니다.
from https://stackoverflow.com/questions/40794181/is-rest-controller-multithreaded by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] @ResponseBody 주석을 사용할 때의 빈 문자열로서의 널 값 (0) | 2019.02.12 |
---|---|
[SPRING] Maven 인덱스 재구성 0 %에서 멈춤 (0) | 2019.02.12 |
[SPRING] Spring 트랜잭션 경계 이해하기 (0) | 2019.02.12 |
[SPRING] Struts에서 Spring MVC 로의 마이그레이션 (0) | 2019.02.12 |
[SPRING] 어떻게 jpa 스프링을 사용하여 저장 프로 시저를 호출 할 수 있습니다. (0) | 2019.02.12 |