2014-01-10 7 views
0

HTTP 스트리밍 서블릿을 구현하여 클라이언트에 푸시 알림을 전달합니다. 그 컨테이너에는 Jersey JAX-RS REST 서비스도 있습니다.HTTP 스트리밍 서블릿에서 요청 당 스레드 구현

문제는 두 개의 브라우저 창에서 스트림을 열 때 다른 요청이 완료 될 때까지 기다려야한다는 것입니다.

나는 비슷한 주제 인 Servlet seems to handle multiple concurrent browser requests synchronously을 읽고 두 개의 서로 다른 브라우저에서 스트림을 열어 작동시켰다.

그리고 AsyncContext를 사용하려고 시도했지만 스트림이 아니라 브라우저 탭을 동시에 열고 실행 스레드가 모든 콘텐츠를 브라우저로 전달할 수 있습니다.

또한 두 개의 브라우저 탭에서 샘플 JSP 페이지를 동시에 열려고 시도했지만 비슷한 결과가 나타납니다.

<HTML> 
    <HEAD> 
     <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> 
     <meta http-equiv="Pragma" content="no-cache"> 
    </HEAD> 
    <BODY BGCOLOR="blue" TEXT="white"> 
    <% 
     try { 
     for (int i=1; i < 100; i++) { 
      out.print("<h1>"+i+"</h1>"); 
      out.flush(); 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       out.print("<h1>"+e+"</h1>"); 
      } 
     } 
     } catch (Exception e) { 
      out.print("<h1>"+e+"</h1>"); 
     } 
     out.print("<h1>DONE</h1>"); 
    %> 
    </BODY> 
    </HTML> 

서버로 Apache Tomcat 7.0을 사용하고 있습니다. 그러나 다른 서블릿 컨테이너를 사용하는 것은 문제가되지 않습니다.

모든 포인터?

감사합니다.

+0

Thread.sleep()이 전체 Servlet 스레드를 중지하기 때문에 그렇습니까? – JustinKSU

답변

0

서블릿 컨테이너에서 스레드 관리를하는 것은 거의 좋은 방법이 아닙니다.

톰캣에서 서버 푸시는 여기 참조하십시오 : http://tomcat.apache.org/tomcat-7.0-doc/aio.html

당신에게 있는지 클라이언트 측 폴링하지만, 쉽게되지 않을 것?

+0

나는 명령으로 말했듯이 doGet 메소드를 제거하고 CometProcessor 인터페이스를 구현하고 무한 루프를 제거하고 기본 HTTP 대신 NIO 커넥터를 설정했습니다. 그리고 같은 구현 이벤트 방법 : 공공 무효 이벤트 (CometEvent 이벤트) IOException이, ServletException을 { 경우 (event.getEventType() == CometEvent.EventType.BEGIN) {여기 \t \t은 ... \t 내 가입 논리입니다 던졌습니다 } } \t 작동하지만 아무 것도 변경되지 않았습니다. –