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