복붙노트

[SPRING] REST 컨트롤러는 멀티 스레드입니까?

SPRING

REST 컨트롤러는 멀티 스레드입니까?

비동기 호출 객체를 반환하는 방법에 대한 자습서를 작성했습니다. 의도 한대로 작동합니다. 그러나 첫 번째 요청이 5 초 동안 휴면 상태가되는 동안 두 번째 요청을 받고 컨트롤러는 두 번째 요청을 처리하기 전에 핀란드어로 이전 요청을 기다립니다.

컨트롤러가 모든 요청을 즉시 처리하고 백그라운드에서 자게하는 방법?

@편집하다

예: 상황을 상상해보십시오. 내 컨트롤러가 외부 API에 요청해야하고 응답을 기반으로하면 자체 응답을 보내야합니다. 외부 API 호출에 2 초가 소요됩니다. 컨트롤러가 한 번에 하나의 요청 만 처리 할 수 ​​있기 때문에 내 응용 프로그램 사용자가 2.5 초 만 대기하고 대기열에 두지 않기를 바랍니다.

해결법

  1. ==============================

    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. ==============================

    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 서버 구성).

    통화 중 컨트롤러가 모든 후속 통화를 차단하지는 않습니다. 다중 스레드입니다.

  3. from https://stackoverflow.com/questions/40794181/is-rest-controller-multithreaded by cc-by-sa and MIT license