2013-10-22 2 views
0

나는 다음과 같은 코드가 있습니다JavaEE 어플 asyncContext 객체는 파견 후 새 쓰레드를 생성

@WebServlet(urlPatterns="/Servlet1", asyncSupported=true) 
public class Servlet1 extends HttpServlet { 
private static final long serialVersionUID = 1L; 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     System.out.println("Servlet1 doGet .."); 
     AsyncContext ac = request.startAsync(); 
     System.out.println(request.isAsyncStarted()); 
     ac.dispatch("/Servlet2"); 
     System.out.println("Servlet1 doGet after dispatch .."); 
} 

} 

@WebServlet("/Servlet2") 
public class Servlet2 extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     System.out.println("Servlet2 doGet .."); 
} 

} 

주의 다음과 같은 출력 :

Servlet1 doGet .. 
true 
Servlet1 doGet after dispatch .. 
Servlet2 doGet .. 

공지 사항 지난 2 개 출력 라인을?

내가 (단지 앞으로 요청 디스패처처럼) 기다리고 있었다 ac.dispatch는 새로운 스레드를 생성 것처럼

Servlet2 doGet 
Servlet1 doGet after dispatch .. 

이 보인다.
이것에 대한 아이디어가 있으십니까?
감사합니다.

답변

0

거동 described in the javadoc

있어서, 상기 송출 동작 수행한다하는 컨테이너 관리 스레드에 요청 및 응답 물체를 통과 한 후 즉시 반환한다. startAsync를 호출 한 컨테이너 시작 디스패치가 컨테이너로 반환되기 전에이 메서드를 호출하면 컨테이너 시작 디스패치가 컨테이너에 반환 될 때까지 디스패치 작업이 지연됩니다.

비동기 컨텍스트에 있기 때문에 이는 의미가 있습니다.

+0

감사합니다. 두 번째 부분은 '이 메소드가 startAsync ..라는 컨테이너에서 시작한 디스패치 전에 호출되면'입니다. 제대로 읽는다면 디스패처 객체가 있고이 객체 (플러스 모든 다른 디스패처 객체)는 해당 컨테이너로 리턴해야합니다 이 특정 디스패치 코드가 asychnronous 모드에서 시작될 수 있으십니까? 나는이 권리를 얻었 는가? – yapkm01

+0

@ yapkm01 제 이해는 : 요청을 다루는 원래 쓰레드 내에서'dispatch()'호출이 실행되었고 그 쓰레드가 처리를 완료하지 않았다면, 컨테이너는 요청을 처리하기 전에 그것이 끝나기를 기다립니다. AsyncContext. –

+0

그래서 짧은 (내 코드를 기반으로) servlet1의 ac.dispatch()는 servlet1이 완료 될 때만 시작됩니다. 그렇지 않으면 servlet1이 완료 될 때까지 ac.dispatch()가 기다려야합니다. 의식? – yapkm01

관련 문제