2009-10-04 2 views
1

현재 서블릿에서 서블릿을 읽고 ServletContext 속성에 쓰는 웹 응용 프로그램이 있고 "스레드"(데몬 스레드)는 시작시 초기화되고 현재 회원으로 ServletContext 객체를 보유합니다. 몇 가지 이유 때문에 나는 대신 "Runnable 구현하기"라고 생각하고 있습니다. 서블릿과 비 서블릿이 서로 이야기 할 때 사용할 수있는 공통 리소스가 필요하다는 생각이 듭니다. 나는 전체적으로 ServletContext 패러다임에 조금 붙어있다. 다른 사람이 ServletContext (내 방식 또는 다른 방법)을 사용하는 이유에 대한 포인트를 제공 할 수 있고 또한 시동시 초기화되고 스레드 안전성이있는 싱글 톤 클래스를 사용하려고 생각하면 고맙겠습니다. 서블릿과 비 서블릿의 모든 통신을 라우팅합니다. 당신은 어떻게 생각하십니까?서블릿과 Java의 "worker"스레드가 포함 된 웹 응용 프로그램에서 ServletContext 객체를 사용하는 이유

감사합니다.

+0

"올바른 방법"은 해당 스레드가 수행해야하는 작업에 따라 다릅니다. 'ServletContext'는 무엇을 필요로합니까? – BalusC

+0

안녕하세요 BalusC, 귀하의 의견에 감사드립니다. ServletContext는 일종의 중앙 데이터 저장소로 사용되었습니다.대신 방금 스레드 안전 싱글 톤을 통해 중앙 데이터 저장소를 구현했습니다. – Ittai

답변

7

자바 서블릿 컨테이너는 실제로 관리되는 코드 컨테이너입니다. 서블릿은 수명주기가 매우 잘 정의 된 구성 요소이며 컨테이너와 구성 요소 (필터도 포함될 수 있음)간에 매우 잘 정의 된 계약이 있습니다.

지정 되었 듯이 웹 앱은 수동 반응 형 시스템입니다.

사용자 정의 스레드가 (엄격하게) 허용되지 않는다는 점에서 수동적입니다. (일부 컨테이너는이 제한을 적용하지 않을 수 있지만 자신의 스레드를 산란하여 효과적으로 예약을 벗어나기 때문에 예기치 않은 동작이 발생할 수 있습니다.)

서버에서의 활동 귀하의 코드베이스) 요청에 대한 응답으로 발생하고, 이들은 일반적인 서블릿 애플 리케이션 HTTP 요청에 대한 것입니다.

ServletContext는 컨테이너에있는 특정 웹 응용 프로그램의 모든 구성 요소에 대한 공유 컨텍스트입니다. 이 컨텍스트는 웹 응용 프로그램이 활성화 될 때 만들어지며 비활성화 될 때 소멸됩니다. ServletContextListener 구성 요소를 사용하여 라이프 사이클에 연결하고 라이프 사이클 이벤트에 대한 알림 콜백을받을 수 있습니다.

1 - 생성과 활성을 관리 할 ServletContextListner 구성 요소를 등록 : 당신이 야생 측에 계속하여 웹 응용 프로그램에서 활성 요소를 산란하고자하는 경우

, 당신은 다음을 고려하실 수 있습니다 구성 요소. 웹 응용 프로그램 시작/활성화시 컨테이너에서 콜백을받습니다. 여기서 스레드 구성 요소를 시작할 수 있습니다. 이 컴포넌트는 ServletContext에 대한 참조를 전달받을 것이므로, 그 참조를 쓰레드 된 컴포넌트에 전달할 수있다.

2 - ServletContextListener가 컨텍스트 종료 콜백을 수신 할 때 스레드를 완전히 종료하는 방법을 제공해야한다는 의미에서 스레드 구성 요소 클래스 (Thread 확장 또는 Runnable 구현 여부)를 관리해야하는지 여부. 실행 가능한 작업을 공식화하는 경우에는 ExecutorService이 필요한 기능을 제공하므로 사용자는 바퀴를 재발 명할 필요가 없습니다.

그렇다면 요구 사항을 검토하고 선택한 디자인과 웹 컨테이너 플랫폼을 검토 할 수 있습니다. 보다 정교한 백엔드 스택이 정말로 필요할 수도 있습니다.

+0

안녕하세요 alphazero, 죄송 합니다만 내 서재가 서블릿간에 공통적 인 리소스를 사용해야한다는 점에서 내 질문에 실제로 답변하지 않은 것 같습니다. 및 비 서블릿? 저는 현재'ServletContext'의 모방으로'Singleton' 클래스를 사용하고 있습니다. 그래서 나는 어디에서나'ServletContext'를 전달하는 추한 해킹을 필요로하지 않을 것입니다. (BTW, 나는 이미 내 질문에 대답하지 않는다고 말한 이유 중 일부인 당신의 권고 대부분을 구현하고있다.) – Ittai

+0

나는 그 응답에서 분명히 외부의 공유/공통 자원과 같은 것이 없다고 생각했다. JNDI, JDBC 등과 같은 다른 JEE 스택 API를보기 시작하지 않는 한, 컨테이너 경계에서 사용하지 마십시오. 컨테이너에서의 싱글 톤 사용은 클래스 로더 계층을 제어 할 수없고 싱글 톤 패턴이 공유 클래스 로더 계층. – alphazero