2010-12-06 3 views
1

HttpServletRequest가 중단되었는지 확인하는 방법이 있습니까?HttpServlet에서 중단 된 요청 감지

나는 인스턴트 브라우저 응용 프로그램 (일종의 채팅)을 작성하고 있습니다. 클라이언트는 AJAX-HTTP 요청을 사용하여 루프에서 새로운 이벤트를 요청합니다. 서버 (Tomcat)는 HttpServlet에서 요청을 처리합니다. 이 클라이언트에 대한 새 이벤트가 없으면 서버는 새 이벤트가 도착하거나 시간 초과 (30 초)가 발생할 때까지 응답을 지연합니다.

이제 더 이상 폴링하지 않는 클라이언트를 확인하고 싶습니다. 따라서 새 요청이 도착하면 요청이 끝날 때 킥 타이머를 시작합니다. 클라이언트가 브라우저 창을 닫으면 TCP 연결이 닫히고 HTTP 요청이 중단됩니다.

문제점 : 서블릿이 이벤트 요청 또는 대기 또는 이벤트 또는 시간 초과를 처리하기 때문에 클라이언트가 kick-Timeout으로 실행되지 않습니다.

연결 중단 이벤트를 수신 대기 한 다음 대기 요청을 중지하기 위해 알릴 수 있다면 좋을 것입니다. 하지만 HttpServletRequest 나 HttpServletResponse에서 그와 같은 것을 찾을 수 없었습니다 ...

+0

비동기 요청 및/또는 HTTP 푸시를 처리하는 데 사용하는 API/프레임 워크는 무엇입니까? 귀하의 질문 소리/아주 이상한, 표준 Servlet API를 정상적으로 작동하는 방법이 아니기 때문에, 그래서 당신이 그것을 달성하기 위해 (예 : 혜성, 분위기, 서블릿 3.0 비동기, 달성하기 위해 일부 API/프레임 워크를 사용하는 것 같아요) . 그것은 그 중 하나, 또는 당신이 일을 완전히 잘못하고있다. – BalusC

+0

어떤 프레임 워크도 사용하고 있지 않습니다. 그것은이만큼 간단하다 : ::::::: UpdateServlet의 doGet-방법 (1) 세션 (2) updateClient (3) 인쇄 인코딩 된 이벤트에서 목록 를 얻을 수에서 updateClient을 가져옵니다. ::::::: UpdateClient의 getEvents-방법 어떤 이벤트가 (2) 이 ::::::: UpdateClient addEvent-방법 (1) 이벤트를 추가하는 이벤트를 반환 기다리고없는 경우 (1) 대기 목록에 (2) 대기 스레드를 알립니다. 요청은 다른 스레드에서 동시에 처리됩니다. – Escudo

+0

꽤 잘 작동합니다. :-) – Escudo

답변

0

기다리는 요청을하면 시스템의 성능이 상당히 떨어질 수 있습니다. 요청에 응답하는 스레드는 요청이 열린 채로 있으면 빨리 소모됩니다. 모든 요청을 완료하고 메시지가없는 경우 클라이언트에 "null"을 반환하고 클라이언트가 폴링 한 이후 경과 한 시간을 추적하는 백엔드 스레드가있을 수 있습니다. 스레드는 클라이언트를 비활성으로 표시 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 오픈 연결의 단점을 알고 있습니다. 문제는 이벤트가 도착하면 고객에게 정말 빨리 알려주 길 바랍니다. 대기중인 접근 방식을 사용하지 않았다면 폴링 간격은 작아야합니다. 이것은 다시 많은 트래픽을 초래할 것입니다 ... – Escudo

+0

아하이 봐요.중단을 확인하는 방법이있을 수 있습니다 (미안하지만, 확실하지 않습니다). Comet과 같은 푸시 기술이나 Comet을 감싸는 무언가가 이상적입니다. –

+0

예, 기본적으로 유연성을 높이기 위해이 개념을 직접 구현하려고합니다. 즉각적인 측면은 훌륭하게 작동하지만 켜기/끄기 인식은 중단에 대한 인식에 뒤처집니다. 귀하의 의견에 감사드립니다. :-) – Escudo

1

Servlet 스레드를 보유 및 릴리스하기 위해 일종의 스레드 통지 (Semaphores 또는 Object.wait)를 사용하고있을 가능성이 높습니다. 시간 제한 (~ 10 초)을 대기에 추가 한 다음 연결이 아직 살아 있는지 여부를 확인한 다음 연결이 아직 있으면 다른 10 초 동안 계속 대기하는 방법에 대해 설명합니다.

연결의 "활성"을 폴링 할 수있는 확실한 방법이 있는지 (예 : resp.getOutputStream이 예외를 발생시키지 않는지) 알지 못합니다. 그렇다면 어떤 방법이 가장 좋은지 (가장 안정적이며 CPU 강렬한) .