2011-01-31 3 views
1

J'écris une application VXML qui accepte un appel SIP entrant, puis interroge un service Web sur une application Java exécutée sur une instance Tomcat sur la même machine hôte pour les demandes vocales entrantes (par exemple, lire un fichier audio) invite ou recueille quelques chiffres) à partir d'un canal séparé. Ces demandes vocales sont reçues via une interface WS distincte et mises en cache pour les sessions VXML à collecter. Les demandes vocales peuvent être reçues entre 0,5 seconde et 30 secondes après l'acceptation de l'appel.Thread sleep dans Tomcat

Logiquement, les sessions VXML doivent interroger périodiquement les nouvelles demandes et l'application Java dans Tomcat renvoie une réponse non bloquante indiquant si des demandes ont été reçues. Cependant, une contrainte supplémentaire est que le coût du CPU pour effectuer un appel de service Web à partir de l'interpréteur VXML est assez élevé, donc le répéter régulièrement pour de gros volumes d'appels simultanés affectera sensiblement la capacité du système. Une approche préférée consisterait à demander à l'application Web de bloquer les interrogations de l'application VXML jusqu'à ce qu'une demande de service vocal arrive dans le cache (avec un dépassement de délai de 5 ou 10 secondes, par exemple). Cependant, je comprends que l'utilisation de Thread.sleep sur des threads de servlets pendant de longues périodes est une mauvaise idée dans le meilleur des cas, donc je cherche une alternative pour y parvenir.

Cette application doit prendre en charge de gros volumes de sessions simultanées sur le serveur (en attendant jusqu'à 1000 sessions VXML sur le matériel planifié), il ne serait donc pas acceptable d'augmenter le nombre de threads sur Tomcat.

Existe-t-il un moyen pour que Tomcat puisse ignorer la demande pendant un certain temps tout en libérant le thread de servlet pour d'autres requêtes? Par hasard, Tomcat est-il assez intelligent pour le faire simplement quand j'utilise Thread.sleep? :-)

Merci, fb

Répondre

1

demandes de longue durée et sans blocage d'E/S en Java est généralement appelé « Comet ». Tomcat 6 prend cela en charge de manière propriétaire et est intégré à la spécification Servlet 3.0.

Voir this article pour savoir comment faire les deux.

+0

Merci Skaffman. Je connaissais les concepts des longs sondages utilisés dans Ajax, mais je ne savais pas qu'il y avait un terme spécifique pour cela ou qu'il y avait un soutien explicite dans Tomcat ou Jetty. On dirait ce dont j'ai besoin! –