2010-08-02 4 views
1

Tomcat 컨테이너에서 서블릿과 관련된 모든 필터를 수행하고 서블릿 자체가 동일한 스레드를 사용합니까? 즉 doFilter()는 서블릿의 service() 메소드와 같은 스레드에서 실행될 것인가? 미리 감사드립니다.Tomcat의 서브릿, 필터 및 스레드

답변

-1

네, 각 요청은 단일 서블릿 인스턴스 내에서 수행됩니다. 서블릿 컨테이너는 각 요청을 수신하고 HttpServletRequest 및 HttpServletResponse가 포함 된 새 스레드를 시작합니다. 이 스레드는 서블릿 인스턴스의 서비스 메소드에서 요청을 처리하며 서비스 메소드가 완료 되 자마자 폐기됩니다.

+0

서블릿 컨테이너는 개발자가 아닌 서블릿 라이프 사이클을 관리합니다. – duffymo

+1

서블릿이 SingleThreadModel 인터페이스를 구현하지 않는 한 서비스 메소드가 동기화된다는 것은 사실이 아닙니다. Tomcat은 행복하게 동일한 서블릿을 병렬로 처리하는 스레드를 실행합니다. – nos

+0

'SingleThreadModel'은 5 년 전에 Servlet 2.4 이후 ** ** 더 이상 사용되지 않습니다 **. 당신은 그것을 사용해서는 안됩니다. 그것은 * 나쁜 디자인 *을 나타냅니다. – BalusC

4

예, 각 요청은 모든 필터와 대상 서블릿을 포함하여 단일 스레드에서 수행됩니다.

3

질문이 더 많을 것으로 생각됩니다. ThreadLocal 객체를 사용하여 필터와 서블릿간에 데이터를 전달할 수 있습니까? 어떤 경우에는 대답은 절대적입니다. 앱 서버는 보안, 트랜잭션, 연결 및 기타 요청 정보를 추적하기 위해이 작업을 자체적으로 수행합니다.

ThreadLocal을 설정하는 동일한 코드에서 finally 블록의 ThreadLocal을 지워야합니다.

다른 사람들에 의해 이미 언급 되었 듯이 서블릿 자체는 동기화 될 수도 있고 그렇지 않을 수도 있지만 스레드 상태의 개념과 직결됩니다. 즉 얼마나 많은 쓰레드가 객체 foo에 대해 실행되는지 대 객체를 foo가 볼 수있게 할 수 있습니까? 두 번째 질문에 대한 대답은 항상 예입니다.

  • AsyncContext를 통해 전화를 전달 EJB를에
  • 혼합 @Asynchronous 또는 사용을 만들기 시작 :

    어떤 비동기 통신의 사용을 만든 경우 대답은 '아니오'이다 없을 것이다 유일한 시간

    TimerService

이는 원래 요청 스레드와 관련되지 않은 새 스레드를 시작하는 응용 프로그램 서버와 관련되어 있으므로 모든 ThreadLocal 상태가 새 스레드와 함께 이동하지 않습니다. 또한 이러한 API는 호출자의 보안 및 트랜잭션 컨텍스트가 호출자와 메소드가 다른 스레드에 있기 때문에 호출 된 메소드로 전파 될 수없는 이유이기도합니다.

고급 참고 사항, 일반적으로 InheritableThreadLocal은 비동기 호출이 호출자 스레드의 자식 스레드를 만드는 대신 스레드 풀에 대해 서버에 의해 수행되므로 일반적으로 작동하지 않습니다.