2011-01-31 95 views
1

我正在编写一个VXML应用程序,它接受传入的SIP语音呼叫,然后在同一主机上的Tomcat实例上运行的Java应用程序上轮询Web应用程序以用于传入语音请求(例如,播放音频提示或收集一些数字)。这些语音请求通过单独的WS接口接收并缓存,供VXML会话收集。语音请求可以在接听电话后的0.5秒至30秒以内接收。线程在Tomcat中的睡眠

逻辑上,VXML会话应定期轮询新请求,并且Tomcat中的Java应用程序返回一个非阻塞响应,指示是否收到任何请求。然而,我还有一个额外的限制,就是由VXML解释器进行Web服务调用的CPU成本相当高,因此定期对大量同时调用重复此操作会明显影响系统容量。

优选的方法是让Web应用程序阻止来自VXML应用程序的轮询,直到语音服务请求到达高速缓存(具有例如5或10秒的超时)为止。但是,我明白在servlet线程上长时间使用Thread.sleep是个好主意,所以我正在寻找实现这一点的替代方案。

此应用程序需要支持服务器上的大量同时会话(预计在计划硬件上最多可以有1000个VXML会话),因此仅增加Tomcat上的线程数量将是不可接受的。

有没有一种方法可以让Tomcat在一段时间内为其他请求释放servlet线程,并让它旁边的请求?每个机会,Tomcat都足够聪明,只需使用Thread.sleep就可以做到这一点? :-)

感谢, FB

回答

1

长时间运行的请求和非阻塞I/O在Java中一般被称为 “彗星”。 Tomcat 6以专有的方式支持这一点,并将其纳入到Servlet 3.0规范中。

查看this article了解如何做到这一点。

+0

谢谢Skaffman。我知道在Ajax中使用长周期投票的概念,但并不知道它有一个特定的术语,或者在Tomcat或Jetty中有明确的支持。看起来像我需要的! – 2011-01-31 15:28:38