2011-01-31 93 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