1

我正在编写一个 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

4

1 回答 1

1

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

请参阅本文以了解如何同时执行这两种操作。

于 2011-01-31T15:15:08.523 回答