Я пишу приложение VXML, которое принимает входящий голосовой вызов SIP, а затем опрашивает веб-службу в приложении Java, работающем на экземпляре Tomcat на том же хост-компьютере, для входящих голосовых запросов (например, воспроизводить звуковую подсказку или собирать некоторые цифры) от отдельный канал. Эти голосовые запросы принимаются через отдельный интерфейс WS и кэшируются для сбора сеансов VXML. Голосовые запросы могут быть получены от 0,5 до 30+ секунд после принятия вызова.
По логике, сеансы VXML должны периодически опрашивать новые запросы, а приложение Java в Tomcat возвращать неблокирующий ответ, указывающий, были ли получены какие-либо запросы. Однако дополнительным ограничением, которое у меня есть, является то, что затраты ЦП на выполнение вызова веб-службы из интерпретатора VXML довольно высоки, поэтому регулярное повторение этого для больших объемов одновременных вызовов заметно повлияет на производительность системы.
Предпочтительным подходом было бы, чтобы веб-приложение блокировало опросы от приложения VXML до тех пор, пока запрос голосовой услуги не поступит в кэш (с тайм-аутом, например, 5 или 10 с). Тем не менее, я понимаю, что использование Thread.sleep в потоках сервлетов в течение длительных периодов времени - плохая идея в лучшие времена, поэтому я ищу альтернативу для достижения этого.
Это приложение должно поддерживать большие объемы одновременных сеансов на сервере (ожидается до 1000 сеансов VXML на запланированном оборудовании), поэтому простое увеличение количества потоков на Tomcat неприемлемо.
Есть ли способ заставить Tomcat отложить запрос на некоторое время, освобождая поток сервлета для других запросов? Возможно, Tomcat достаточно умен, чтобы делать это просто, когда я использую Thread.sleep? :-)
спасибо, фб