2009-09-10 4 views
1

특정 요구 사항에 대해 ServletContextListener를 사용하는 것이 적절한 지 알 수 있습니까?Java/Apache Tomcat 웹 응용 프로그램에서 ServletContextListener의 적절한 사용

내가 갖고있는 것은 매 시간마다 특정 작업을 실행하여 많은 RSS 피드를 폴링하고 언제든지 사용자가 폴링을 위해 새 RSS 피드를 정의 할 수있는 웹 응용 프로그램입니다.

내가 피하고 싶은 것은 사용자가 현재 시간별 폴링주기 동안 피드를 추가하고 해당주기에이 피드를 포함시키는 것입니다.

그래서 저는 폴링 사이클의 실행 여부를 기록하는 정적 부울 변수와 함께 ServletContextListener를 사용하고 있습니다. 매시간 폴링주기가 실행중인 경우 사용자가 정의한 새 피드는이주기에 포함되지 않습니다. 폴링이 실행 중이 아니면 다음 시간마다 피드를 포함시킬 수 있습니다.

누구든지 조언 할 수 있습니까? 내가 볼 수있는 유일한 대안은 데이터베이스 테이블에 플래그를 사용하거나 속성 파일의 값을 업데이트하는 것입니다 (수행 할 수있는 경우).

감사합니다.

Martin O'Shea.

답변

2

그 생각은 좋지 않습니다. 웹 응용 프로그램에 웹 응용 프로그램에 대한 속성 ("폴링주기 실행")을 보유하기 위해 단순히 ServletContext을 사용하지 않는 것이 어떻습니까? 웹 앱의 작업에서 시작되는 구성 요소는 컨텍스트에서 속성을 설정합니다. 예 : AddRSS의 작업으로 모든 관심이 구성 요소는 (당연히 같은 맥락에서 그 속성을 확인합니다.

servletCtx.setAttribute(POLLING_CYCLE_FLAG_ATTR, true); 

if(!servletCtx.getAttribute((POLLING_CYCLE_FLAG_ATTR)) { 
    // let the user add the feed ... 
} 

ServletContextListener 모든 웹 응용 프로그램의 수명주기와 관한 것입니다 웹 응용 프로그램의 ServletContext으로 변경됩니다. 일반적으로 응용 프로그램의 모듈에 대한 자원을 초기화하고 정리하는 데 사용됩니다. 그러나 기본적으로 ServletContext에서 발생하는 문제를 확인해야하는 경우 ServletContextListener은 친구입니다.

+0

이것은 정확히 필요한 것입니다. 따라서 POLLING_CYCLE_FLAG_ATTR은 서블릿 컨텍스트의 전역 변수가됩니까? –

+0

한 가지 질문. 서블릿을 사용하여 시스템 시작시 폴링을 no로 설정할 수 있지만 시간별 폴링을 실행하는 클래스는 서블릿이 아닙니다. ServletContext는 표준 클래스에서 액세스 할 수 있습니까? 아니면 폴링 클래스를 변환해야합니까? 나에게 이것은 서블릿이 주로 요청/응답 수단 인 경우 거의 이해가되지 않는다. –

+0

웹 앱이 매 시간마다 특정 작업을 실행한다고 가정 했으므로 작업이 웹 앱 내에서 시작되었다고 가정했습니다. 그렇다면 작업을 시작할 시점에서 서블릿 컨텍스트에 액세스해야합니다. 서블릿의 getServletContext() 메소드를 사용하여 언제든지 ServletContext에 액세스 할 수 있습니다. 컨텍스트를 웹 응용 프로그램의 네임 스페이스로 생각하는 것이 가장 좋습니다. 응용 프로그램이 여러 노드의 컨테이너에 클러스터 된 경우 리스너의 라이프 사이클 후크를 사용하여 공유 리소스 (일반적으로 db)의 컨텍스트 특성을 동기화해야합니다. – alphazero

2

피드 데이터를 데이터베이스에 보관 하시겠습니까? 어떻게 데이터베이스에 액세스하는지 모르지만 일반 jdbc를 사용하면 결과 세트를 폴링하고 반복 할 피드를 선택할 수 있습니다. 새로 추가 된 피드 (선택 후)는이 결과 집합에 나타나지 않으므로 포함되지 않습니다.

어떤 이유로 든 문제에 해당되지 않는 경우 해당 업적을 소장품으로 읽어서 작업 할 수 있습니다.

아니면 완전히 질문을 놓쳤습니까?

+0

질문을 놓치지 않았습니다. 나는 단순히 폴링이 활성화되었을 때 플래그가 설정 됨으로써 추가 보안 레이어를 구현하려고합니다. 이렇게하면 새 피드를 다른 시간에 폴링하도록 설정하여 새로 정의 된 피드가 폴링 시간에 결과 세트에 추가되는 것을 방지 할 수 있습니다. –

+0

OP가 맞습니다. 이것은 데이터베이스가 처리 할 수 ​​있어야하는 것입니다. 피드를 읽는 JDBC 연결에서 격리 수준 SERIALIZABLE을 설정하기 만하면됩니다. 그러나 정말로 이것을하고 싶다면 ... –

0

ServletContext 속성이 Servlet API에서 '전역 변수'의 정렬을 만드는 방법 인 마지막 게시물에 동의하십시오.

이것은 서블릿 컨테이너 인스턴스 또는 하나의 컨테이너에있는 웹 앱에서 작동하지 않습니다. 각각은 그것 자신의 ServletContext를 가질 것이다. 하나의 인스턴스 만 있으면 작동합니다. 그렇지 않으면 데이터베이스 플래그가 필요하다고 생각합니다.

서블릿은 init() 메소드를 통해 ServletContext 객체에 액세스합니다. ServletContextListener는 contextInitialized (ServletContextEvent sce) 라이프 사이클 이벤트를 통해 액세스 할 수도 있습니다. 설문 조사 클래스가 ServletContext 수명 주기로 시작하고 중지하는 리스너로 존재하는 것이 합리적이라고 생각합니다. 그리고 초기화 될 때 ServletContext에 액세스 할 수 있습니다 (예).

+0

한가지는 나를 혼란스럽게합니다 : 나는 두 개의 클래스로 끝날 것입니다; (1) 애플리케이션이 시작될 때 실행되고 폴링을 no로 설정하는 리스너, (2) 폴링 클래스. 당신은 (2) 서블릿이나 청취자로 변환해야한다고 말하고 있습니까? –

+0

아니면 단일 청취자가 초기화 및 폴링을 처리 할 수 ​​있습니까? –

+0

쉽게 하나의 클래스가 될 수 있습니다. 시작/정지 신호와 ServletContext에 대한 액세스를 수신하는 리스너 메소드를 구현하면됩니다. 그 너머 에선, 네가 좋아하는대로 할 수 있고, 두 가지 수업을해야 할 이유가 없다. –

관련 문제