2013-08-26 2 views
7

서블릿 애플리케이션에 정상적인 종료 메커니즘을 구현해야합니다.긴 종료 동안 서블릿 요청을 처리하는 방법

편집 : 우리는 운영 체제의 기능을 통해 전송 킬 (kill) 신호를 처리 할 것이다, 가능한 한 간단하게하고 싶다. 이렇게하면 시스템 관리자가 쉘 유틸리티 (Windows에서는 kill 또는 taskkill)를 사용할 수 있습니다. 그렇지 않으면 서버와 "대화"하기 위해 다른 유틸리티를 설치해야합니다.

이 메커니즘은 두 단계로 작동합니다

종료 요청에 따라
  1. , 거부 중요한 특정 활동
  2. 블록 이전에 시작 중요한 작업이 완료 될 때까지; 이들은 몇 시간 단계 # 1 우리 DAO 층에서 구현

걸릴 수 있습니다. 2 단계가 ServletContextListener # contextDestroyed 메소드에 구현되었습니다.

일단 contextDestroyed가 호출되면 서블릿 컨테이너는 더 많은 HTTP 요청을 처리하지 못합니다.

편집 : 누군가가 서버의 프로세스에 대한 운영 체제의 살인 함수를 호출 할 때 contextDestroyed이라고합니다.

우리는 어떤 활동을 사용할 수 있음을 사용자에게 통지, 단계 # 2 동안 살아 응용 프로그램을 수 있도록하고 싶습니다.

+0

좋은 질문입니다. 거부 될 활동이 특정 서블릿에서 구현되는 경우 DB 조회에서 시스템 종료가 진행 중임을 나타내는 경우 항상 4xx 범위의 상태를 반환 할 수 있습니다. –

+0

일부 활동은 UI 작업에 의해 시작되고 일부 활동은 스케줄러에 의해 시작됩니다. 그래서 DAO 계층에서 활동을 제어 할 생각입니다. –

답변

4

사용하십시오 filter는 모든 중요한 요구의 목록을 유지합니다.

"준비 종료"요청을 받으면 필터는 일부 요청을 거부하기 시작해야합니다.

대기열에 남아있는 중요한 작업 수를 알려주는 서블릿을 작성하십시오.

종료 도구에서 "준비 종료"를 보내십시오. 중요한 작업의 수에 대한 서블릿을 폴링합니다. 이 값이 0에 도달하면 실제 shutdown 명령을 보냅니다.

이렇게하려면 비즈니스 계층에서이를 조정하는 서비스를 만듭니다. 전에 모든 것이 발생해야합니다.contextDestroyed()이 호출되기 전에해야합니다. 특별한 애플리케이션 종료는 세계의 J2EE 뷰에 맞지 않으므로 직접 관리해야합니다.

서비스는 종료가 진행 중일 때 중요한 작업이 얼마나 많은지 알려줄 수 있어야합니다. 서블릿과 필터는이 서비스를 사용하여 요청을 거부하거나 남아있는 작업 수를 알 수 있습니다.

모든 작업이 완료

, 다음 응용 프로그램은 이제 죽음에 대한 준비가되어 있음을 이야기한다 "셧다운 정보는"서블릿에 대한 액세스를 제외한 모든 요청을 거부합니다.

관리자에게 앱 종료를 시작하기위한 좋은 UI를 제공하는 도구를 작성하십시오.

[편집] OS가 응용 프로그램을 종료하지 못하게 할 수 있습니다. 그렇게하지 마십시오.

내가해야 할 일은 위에서 설명한 2 단계 프로세스를 사용하여 응용 프로그램을 종료하는 특수 도구를 작성하는 것입니다. 이것이 표준 종료 방법입니다.

예, 관리자가 불만을 제기합니다. Unix에서는이 스크립트를 init 스크립트에 넣어서 숨길 수 있으므로 아무도 눈치 채지 못하게 할 수 있습니다. Windows에서도 비슷한 솔루션이있을 수 있습니다.

종료 코드의 버그, 정전 중 긴급 종료, 응용 프로그램 코드의 버그 또는 Murphy 발생과 같은 예상되지 않는 상황이 발생할 경우 서버를 강제 종료 할 수 있어야합니다.

+0

일부 활동은 UI 조치로 시작되고 일부 활동은 스케줄러에 의해 시작됩니다. 스케줄러가 시작한 작업에는 필터가 작동하지 않습니다. –

+0

필터는 전체 목록 (정적 변수 또는 응용 프로그램 범위의 항목)에 목록/대기열을 유지해야합니다. 따라서 스케줄러가이를 볼 수있는 방식으로 구현할 수 있습니다. 다른 모든 것이 실패하면 DI 프레임 워크를 사용하십시오. –

+0

그러면 비즈니스 논리 계층이 프레젠테이션 계층을 "알 수"있습니다. –

관련 문제