2010-12-12 39 views
0

J'ai une servlet Java qui sert de façade à d'autres services Web déployés sur la même instance Tomcat. Mon servlet wrapper crée N plusieurs threads, chacun invoquant un service Web, rassemble la réponse et la renvoie au client. Les services Web sont déployés sur la même instance Tomcat que différentes applications.Empêcher le blocage des threads dans Tomcat

Je vois le blocage des threads sur ce service de wrapper de façade après quelques heures de déploiement qui font tomber l'instance de Tomcat. Tous les sujets bloqués sont des paramètres à cette façade webservice (comme http: // domain/appContext/facadeService)

Y at-il un moyen de contrôler ce fil de blocage, en raison de la famine de threads disponibles qui font réellement le traitement? Quelles sont les meilleures pratiques pour éviter de tels blocages?

+1

Vous devez améliorer votre taux de réponse. Je pourrais vous aider mais je ne veux tout simplement pas car vous n'êtes pas dérangé d'accepter les réponses données. – mindas

+0

Pour la plupart des questions que j'ai soulevées, je n'ai pas trouvé de réponse définitive et, par conséquent, elles sont toujours ouvertes. – sangupta

+0

Y a-t-il une dépendance entre les services Web? Par exemple, webservice1 peut-il appeler webservice2? – Joel

Répondre

1

La solution commune à ce problème consiste à utiliser le cadre Executor. Vous devez exprimer votre appel de service Web en tant que Callable et le transmettre à l'exécuteur en l'état ou en tant que Collection<Callable> (voir la liste complète des options Javadoc).

Vous avez deux choix pour contrôler l'heure. La première consiste à utiliser les paramètres d'une méthode appropriée de la classe Executor où vous spécifiez le délai maximal d'expiration du service Web. Une autre option consiste à obtenir le résultat (qui est exprimé sous la forme Future<T>) et à utiliser .get(long, TimeUnit) pour spécifier la durée maximale pendant laquelle vous pouvez attendre un résultat.

+0

Mais l'utilisation d'un délai d'attente ne résout toujours pas la cause de l'interblocage sous-jacent? – Joel

+0

Il n'y a aucune limite aux raisons pour lesquelles les threads pourraient être bloqués - en particulier quand aucun contexte n'est donné. Par exemple, il est facile d'arriver à un interblocage si des classes non thread-safe sont utilisées (voir question 1068190 sur SO). Mais le conseil général est d'utiliser Executor/Future comme vous pouvez au moins récupérer les threads qui attendaient désespérément depuis longtemps. – mindas

+0

Nous utilisons déjà le framework Executor pour la même chose, même si nous n'avons pas eu de timeout sur les threads. – sangupta