2014-01-10 20 views
0

我正在实现HTTP流媒体servlet以向客户端传递推送通知。在该容器中还有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。但使用另一个servlet容器不会成为问题。

任何指针?

感谢

+0

是否因为Thread.sleep()会停止整个Servlet线程? – JustinKSU

回答

0

从servlet容器做你自己的线程管理是几乎从来没有一个好主意。

有关Tomcat服务器推送在这里看到:http://tomcat.apache.org/tomcat-7.0-doc/aio.html

确定客户端的投票将不容易有关系吗?

+0

我按照说明完成的操作,删除了doGet方法并实现了CometProcessor接口,删除了无限循环并设置了NIO连接器而不是默认的HTTP。而像实施的事件法: 公共无效事件(CometEvent事件)抛出IOException异常,ServletException异常{ 如果(event.getEventType()== CometEvent.EventType.BEGIN){ \t \t这里是我的订阅逻辑... \t } } \t 它的工作原理,但没有任何改变。 –