2008-10-17 7 views
4

J'ai besoin de mettre à l'échelle les appels dans Tomcat et il a été suggéré de lancer des threads en interne. Quelqu'un at-il eu besoin de faire cela et, si oui, quelles solutions ont-ils trouvées?Comment lancer plusieurs threads depuis Java EE?

+0

Vous avez vraiment besoin d'ajouter plus de détails sur ce que vous essayez d'accomplir. Tâches longues, simultanéité, volume ... – Robin

+0

Je me suis souvent posé des questions sur cette question: est-il «OK» de lancer des threads à partir d'un serveur d'application? Je n'ai pas trouvé de réponse faisant autorité, donc j'espère que votre question deviendra bientôt une bonne documentation pour ce sujet. –

Répondre

1

Votre question est un peu vague. Tomcat lui-même utilise déjà un pool de threads pour traiter les requêtes HTTP. Vous pouvez augmenter le nombre de threads grâce à la configuration de Tomcat. Pour plus d'informations, consultez le wiki Tomcat.

Si vous voulez dire que dans votre code que vous voulez lancer les discussions, alors je vous conseille lisant attentivement l'API java.util.concurrent introduit en Java 5. Lisez également « Programmation concurrente en Java », qui est le texte sur ce assujettir.

1

Quel est le problème que vous essayez de résoudre avec les threads?

Si vous avez des tâches en cours d'exécution, vous devez utiliser JMS + un conteneur Java EE complet. Si vous tentez de gérer une surcharge, vous pouvez envisager deux instances de tomcat. Toutefois, si vous utilisez des sessions http, vous devrez étudier la réplication de session.

Si vous êtes obligé d'utiliser Tomcat, utilisez le framework Executors dans java.util.concurrency.

5

La création de vos propres threads dans un serveur d'applications est généralement déconseillée car le serveur doit gérer les threads pour une meilleure évolutivité. Vous pouvez également rencontrer des problèmes si le conteneur fait des suppositions sur ce qui est disponible dans un contexte de thread, tel que des informations de sécurité (par exemple, sujet authentifié). Cela se produit généralement si vous générez un thread, puis utilisez une ressource serveur de ce thread qui est inconnue du conteneur.

Vérifiez s'il existe un moyen d'obtenir des threads gérés par conteneur à partir de Tomcat. WebLogic et WebSphere prennent en charge commonj.WorkManager, ce qui vous permet de planifier le travail sur les threads gérés par le conteneur. Spring peut également utiliser commonj, mais je ne suis pas sûr si ce support est disponible sur Tomcat.

1

Vous ne devriez pas vraiment lancer des threads à partir de votre webapp, sauf si vous avez vraiment besoin de le faire. Sans plus de détails sur votre problème, il est difficile de dire si c'est la bonne approche pour résoudre votre problème.

Vous pouvez jeter un oeil à Quartz, qui « est un système d'ordonnancement des tâches, open source complète qui peut être intégré avec ou utilisé le long du côté pratiquement toute application J2EE ou J2SE ».

0

Comme d'autres l'ont demandé, vous devriez donner plus de détails sur ce que vous essayez d'accomplir.

Sinon, tomcat utilise des pools de threads. augmenter le nombre de threads dans le pool. Utilisez une version plus récente de tomcat - 6.x. Utilisez Java 6.0_10. Si nécessaire, réglez l'application à l'aide d'un profileur et manipulez les paramètres de la JVM, si nécessaire.

0

L'abstraction J2EE pour le multithreading géré est JCA. En particulier, regardez les classes WorkManager et Work. Voir aussi this arcicle. Spring propose également une abstraction de gestionnaire de travaux soutenue par JCA.