线程在Tomcat中睡眠

时间:2011-01-31 15:08:50

标签: multithreading tomcat sleep nonblocking vxml

我正在编写一个VXML应用程序,该应用程序接受传入的SIP语音呼叫,然后轮询在同一主机上的Tomcat实例上运行的Java应用程序上的Web服务,以获取传入的语音请求(例如,播放音频提示或收集一些来自单独频道的数字)。这些语音请求通过单独的WS接口接收,并缓存以供VXML会话收集。在接受呼叫之后,可以在0.5秒到30秒之间的任何地方接收语音请求。

逻辑上,VXML会话应定期轮询新请求,Tomcat中的Java应用程序返回非阻塞响应,指示是否已收到任何请求。但是我的另一个限制是从VXML解释器进行Web服务调用的CPU成本非常高,因此定期重复大量同时调用会显着影响系统容量。

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

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

有没有办法让Tomcat在释放servlet线程以获取其他请求的同时将请求搁置一段时间?有可能,当我使用Thread.sleep时,Tomcat是否足够聪明? : - )

谢谢, FB

1 个答案:

答案 0 :(得分:1)

Java中长时间运行的请求和非阻塞I / O通常称为“Comet”。 Tomcat 6以专有方式支持它,并且它已被整合到Servlet 3.0规范中。

请参阅this article了解如何同时执行这两项工作。