51 votes

Quelle est la méthode recommandée pour générer des threads à partir d'une servlet dans Tomcat

Probablement une répétition! J'utilise Tomcat comme mon serveur et que vous voulez savoir quel est le meilleur chemin pour frayer les threads dans la servlet avec déterministe résultats. Je suis en cours d'exécution à certains long de l'exécution de mises à jour à partir d'une servlet action et voudrais de la demande est complète et que les mises à jour se produisent en arrière-plan. Au lieu d'ajouter un middleware de messagerie comme RabbitMQ, je pensais que je pouvais lancer un thread qui pourrait fonctionner en arrière-plan et de finir dans son propre temps. J'ai lu chez d'autres threads que le serveur met fin à fils engendré par le serveur afin de gérer les ressources.

Est-il recommandé de frai de threads, les travaux en arrière-plan lors de l'utilisation de Tomcat. J'ai aussi utiliser Spring MVC de l'application.

47voto

BalusC Points 498232

Votre meilleure option est d'utiliser une application large pool de threads avec un montant maximal de threads, de sorte que les tâches seront mis en file d'attente chaque fois que nécessaire. L' ExecutorService est très utile dans ce.

Lors du démarrage de l'application ou de l'initialisation de la servlet utiliser les Exécuteurs de la classe:

executor = Executors.newFixedThreadPool(10); // Max 10 threads.

Ensuite, au cours du servlet de service (vous pouvez ignorer le résultat pour le cas où vous ne sont pas intéressés):

Future<ReturnType> result = executor.submit(new CallableTask());

Enfin, lors de l'application de l'arrêt ou du servlet détruire:

executor.shutdownNow(); // Returns list of undone tasks, for the case that.

30voto

Pascal Thivent Points 295221

Vous pourriez peut-être utiliser un CommonJ WorkManager (JSR 237) mise en œuvre comme Foo-CommonJ:

CommonJ − JSR 237 Timer & WorkManager

Foo-CommonJ est un JSR 237 Minuterie et WorkManager mise en œuvre. Il est conçu pour être utilisé dans des contenants ne pas venir avec leur propre mise en œuvre – essentiellement de la plaine de la servlet les conteneurs comme Tomcat. Il peut également être utilisé dans entièrement soufflé applications Java EE les serveurs qui n'ont pas de WorkManager API ou non-standard de l'API comme JBoss.

Pourquoi à l'aide de WorkManagers?

La commune de cas d'utilisation est qu'un Servlet ou JSP doit regrouper des données provenant de de multiples sources et de les afficher dans une seule page. Faire votre propre à enfiler une géré de l'environnement comme un J2EE le conteneur est inapproprié et doit ne jamais être fait au niveau de l'application code. Dans ce cas, le WorkManager API peut être utilisé pour récupérer les données dans en parallèle.

Installation/Déploiement CommonJ

Le déploiement de ressources JNDI fournisseur de personne à charge. Cette mise en œuvre vient avec une Usine de classe que met en œuvre la javax.naming.spi.ObjectFactory interface avec le rend facilement déployable en plus populaire les conteneurs. Il est également disponible en tant que Service JBoss. de plus...

Mise à jour: Juste pour préciser, ici, est ce que la Simultanéité des Utilitaires pour Java EE Aperçu (il semble que ce soit le successeur de la JSR-236 & JSR-237) écrit à propos de la non géré threads:

2.1 Container-Managed vs non géré Fils

Serveurs d'applications Java EE exiger de la gestion des ressources dans l'ordre afin de centraliser l'administration et de la protéger les composants de l'application de consommer des ressources inutiles. Cela peut être atteint par la mise en commun de des ressources et de la gestion d'une ressource cycle de vie. À l'aide de Java SE de la simultanéité les utilitaires tels que l' java.util.concurrencyAPI, java.lang.Threadet java.util.Timer dans un serveur demande de composant comme une servlet ou EJB sont problématiques, puisque le contenant et le serveur n'ont pas de la connaissance de ces ressources.

Par l'extension de l' java.util.concurrentAPI, et des serveurs d'application Java EE les conteneurs peuvent devenir conscients de l' les ressources utilisées et de fournir le contexte de l'exécution correcte pour le les opérations asynchrones à courir avec.

Cet objectif est largement atteint en fournissant géré versions de la principale java.util.concurrent.ExecutorService les interfaces.

Donc rien de nouveau de l'OMI, le "vieux" problème est le même, non géré fil sont encore non géré threads:

  • Ils sont inconnus pour le serveur d'application et n'ont pas accès à Java EE de l'information contextuelle.
  • Ils peuvent utiliser des ressources sur l'arrière du serveur d'applications, et sans administration de la capacité de contrôle de leur nombre et de l'utilisation des ressources, ce qui peut influer sur le serveur d'application sa capacité à récupérer les ressources de l'échec, ou à l'arrêt en douceur.

Références

6voto

Jaydeep Patel Points 1389

Spring prend en charge les tâches asynchrones (dans votre cas de longue durée) via la planification de printemps. Au lieu d'utiliser des threads Java directs, je suggère de l'utiliser avec Quartz.

Recours:

4voto

dty Points 11383

À proprement parler, vous n'êtes pas autorisé à créer des threads conformément à la spécification Java EE. J'envisagerais également la possibilité d'une attaque par déni de service (délibérée ou non) si plusieurs demandes arrivent en même temps.

Une solution middleware serait définitivement plus robuste et conforme aux normes.

1voto

Nereis Points 100

Depuis le printemps 3, vous pouvez utiliser les annotations @Async:

 @Service
public class smg {
  ...
  @Async
  public getCounter() {...}
}
 

avec <context:component-scan base-package="ch/test/mytest"> et <task:annotation-driven/> dans le fichier de contexte

Veuillez vous référer à ce tutoriel: http://spring.io/blog/2010/01/05/task-scheduling-simplifications-in-spring-3-0/

Cela fonctionne très bien pour moi sur Tomcat7 et vous n'avez pas à gérer un pool de threads.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X