2011-05-11 71 views
0

我正在使用GWT RCP开发GWT中的Web应用程序构建。应用程序专为使用redis消息传递的即时消息传递而设计。请求servlet在队列中等待

在服务器上等待消息时,我在redis上订阅该频道时,所有内容都按计划运行。虽然当服务器上等待请求的数量大于5时,第6个请求不会开始处理,而是一直处于等待状态,直到处理完其中一个请求。我不确定这个问题是否出现在redis中(我正在使用jedis库),因此我试图直接调用currentThread来休眠,但它的行为相同。

public class TestServiceImpl extends RemoteServiceServlet implements 
      TestService { 

    @Override 
    public void syncWait(Date time) { 
     try{ 
      Thread.currentThread().sleep(10000l); 
     }catch (Exception e) { 
      getLogger().error("sleep error", e); 
     } 
     return ; 
    } 
} 

这不仅仅是一个特定的servlet,当5个请求被打开时,6th甚至不会加载静态内容。我在jety,glassfish和tomcat上试过。

我也尝试更改glassfish中的线程池设置,我在200上设置了maxthread-count,但它没有工作。

请问关于如何增加处理的会话数和每个服务器的请求数?

回答

0

为此,您真的想使用servlet Comet实现和NIO连接器之一。我并不熟悉Glassfish或Jetty,但在Tomcat上,您可以使用APR(请参阅http://tomcat.apache.org/tomcat-6.0-doc/apr.html)和高级IO(请参阅http://tomcat.apache.org/tomcat-6.0-doc/aio.html)的组合来执行所需操作。

请注意,使用Tomcat的高级IO比标准的Servlet 2.5 api更复杂(且文档较少)。我相信Resin,Tomcat 7和Glassfish支持Servlet 3.0规范,它也提供对类似功能的支持:你可能想看看这个。

+0

感谢您的回答,但我不确定是否需要Comet和NIO。彗星是为了处理一致的请求。我不需要处理并发请求,我只是在服务器打开5个连接时开始处理请求时出现问题。这是彗星解决方案吗? – LuiGi 2011-05-12 05:23:00

+0

通常在Servlet中的线程上调用'sleep'是一个坏主意:如果你有多个请求空闲,那么你会需要Comet和NIO。就超过5个连接而言,您必须在某处存在配置缺陷,因为您应该可以处理超过5个连接。 – Femi 2011-05-12 05:47:32