2017-09-14 3 views
5

나는 Spring Boot to build a RESTful web service을 사용하고 있습니다. 내 IDE는 Eclipse Oxygen입니다.스프링 부트 : 동시에 여러 요청을 처리하십시오.

나는 크롬을 통해 2 초마다에서 여러 HTTP GET 요청을 보낼 수 있지만, 그들은 하나에 의해 하나를 트리거됩니다. 각 요청은 이전 요청이 완료 될 때까지 대기합니다.

Thu Sep 14 11:31:15 EDT 2017: ThreadId 25 
Thu Sep 14 11:31:20 EDT 2017: ThreadId 26 
Thu Sep 14 11:31:25 EDT 2017: ThreadId 28 
Thu Sep 14 11:31:30 EDT 2017: ThreadId 30 

콘솔 출력은 컨트롤러가 5 초마다라는 것을 보여줍니다

@RestController 
@RequestMapping("/dummy") 
public class DummyController { 
    @RequestMapping(method = RequestMethod.GET) 
    public ResponseEntity<Map<String, String>> dummytsp(@RequestParam(value="msg", defaultValue="Hello") String msg) { 
     System.out.println("" + new Date() + ": ThreadId " + Thread.currentThread().getId()); 

     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     Map<String, String> response = new HashMap<>(); 
     response.put("message", msg); 
     return new ResponseEntity<>(response, HttpStatus.OK); 
    } 
} 

내 콘솔 넣어은 다음과 같습니다

여기 내 컨트롤러 코드입니다. 하지만 2 시간마다 요청을 보냅니다..

동시에 여러 수신 요청을 처리 할 수 ​​있습니까?

내가 다른 브라우저에서 요청을 보낼 경우

, 그것은 완벽하게 작동합니다 :

UPDATE (I 콘솔 출력을 2 초마다 표시되어야합니다). 세션을 공유하는 동일한 브라우저/응용 프로그램에서 테스트하면 문제가 발생합니다.

동시 복수 요청을 동일한 세션에서 받아 들일 수 있습니까?

감사합니다.

+0

재현 할 수 없습니다. 기본적으로 스프링 부트 웹 애플리케이션은 멀티 스레드이며 여러 요청을 동시에 처리합니다. Embedded Tomcat을 사용하고 있습니까? 기본 스레드 설정 (예 :'server.tomcat.max-threads')을 변경 했습니까? –

+0

@KyleAnderson 다른 브라우저에서 요청을 보내면 코드가 제대로 작동합니다. 문제는 동일한 브라우저에서 요청 (열린 탭)을 보낼 때 나타납니다. 내 게시물 pls 수표를 업데이 트했습니다. 타이! –

+0

이것은 브라우저 별 특이 사항 일 수 있습니다. Windows 10에서 Chrome 및 Firefox는 여러 개의 요청을 동일한 URL에 대기시키는 것처럼 보이지만 IE, Edge 및 컬은 그렇지 않습니다. –

답변

4

기본적으로 스프링 부트 웹 응용 프로그램은 멀티 스레드이며 여러 요청을 동시에 처리합니다.

브라우저 별 특징 일 수 있습니다. Windows 10에서 Chrome & Firefox는 IE, Edge, & 컬링이없는 반면 동일한 URL에 여러 요청을 대기열에 넣는 것처럼 보입니다.

-3

스프링 빈은 기본적으로 싱글 톤 빈입니다. 싱글 톤은 컨테이너 당 하나의 객체 인스턴스를 의미합니다. 그래서 실제로 하나의 컨테이너에 DummyController 인스턴스가 하나 있습니다. 첫 번째 요청이 도착하고 Thread가 5 초 동안 잠자기 상태가됩니다. 깨어나면 실행이 완료되고 객체가 해제되고 두 번째 요청에 의해 선택됩니다. 확인 Is REST controller multithreaded?

+0

그렇다면 Spring-Boot는 어떻게 많은 요청을 동시에 처리합니까? –

+4

'Controller' 빈은'Singleton '이지만, 여러 스레드에서 접근하는 것을 배제하지 않습니다.실제로 스프링 부트 서블릿 컨테이너는 멀티 스레드이므로 여러 요청을 동시에 처리 할 수 ​​있습니다. –

관련 문제