Thread d’arrière-plan pour une application de servlet Tomcat

Je ne suis pas très familier avec Tomcat, dans ma tête il est fondamentalement abstrait comme un serveur cgi qui enregistre la JVM entre les appels – je sais que cela peut faire beaucoup plus que cela, cependant.

Je cherche un moyen de lancer un thread d’ arrièreplan lorsqu’un serveur Tomcat démarre, ce qui mettrait périodiquement à jour le contexte du serveur (dans mon cas particulier, il s’agit d’un thread qui écoute les pulsations d’autres services et met à jour les informations de disponibilité). une variété d’utilisations pour cela).

Existe-t-il un moyen standard de le faire? Tant le lancement que la mise à jour / l’interrogation du contexte?

Tout pointeur vers la documentation pertinente et / ou les exemples de code serait très apprécié.

Si vous souhaitez démarrer un thread lorsque votre WAR est déployé, vous pouvez définir un écouteur de contexte dans le fichier web.xml:

  com.mypackage.MyServletContextListener   

Ensuite, implémentez cette classe quelque chose comme:

 public class MyServletContextListener implements ServletContextListener { private MyThreadClass myThread = null; public void contextInitialized(ServletContextEvent sce) { if ((myThread == null) || (!myThread.isAlive())) { myThread = new MyThreadClass(); myThread.start(); } } public void contextDestroyed(ServletContextEvent sce){ try { myThread.doShutdown(); myThread.interrupt(); } catch (Exception ex) { } } } 

Je cherche un moyen de lancer un thread d’arrière-plan lorsqu’un serveur Tomcat démarre

Je pense que vous cherchez un moyen de lancer un thread d’arrière-plan lorsque votre application Web est démarrée par Tomcat.

Cela peut être fait en utilisant un ServletContextListener . Il est enregistré dans web.xml et sera appelé lorsque votre application est démarrée ou arrêtée. Vous pouvez ensuite créer (et arrêter ultérieurement) votre thread, en utilisant les méthodes Java normales pour créer un thread (ou un service d’exécution).

Placer 1 dans le bloc dans votre fichier web.xml forcera l’ init() de votre servlet dès son démarrage, au lieu d’attendre la première demande à arriver. Ceci est utile si vous voulez générer le thread d’arrière-plan à partir d’ init() .

Je voudrais juste apporter un petit changement à la réponse très détaillée que Chris a donnée; Je définirais myThread comme un thread Daemon par myThread.setDaemon(true); ce qui va garder le thread actif tant que vous avez d’autres threads non-Daemon qui ont besoin de votre thread d’arrière-plan. Lorsque tous ces threads sont terminés, votre thread Daemon est arrêté par la JVM et vous n’avez pas besoin de le gérer vous-même dans contextDestroyed . Mais c’est juste mes 2 cents.

Si vous utilisez un framework basé sur Spring, vous pouvez également spécifier la classe / thread que vous souhaitez initialiser dans le fichier beans.xml. Ainsi, au démarrage de Tomcat, beans.xml initialisera toutes les classes mentionnées. Vous pouvez également transmettre des arguments de constructeur si nécessaire. Voici l’exemple de la même chose.

beans.xml

    

MonitoringService.java

 public class MonitoringService{ private MyThread myThread; public MonitoringService(int seconds){ myThread = new MyThread(seconds); myThread.start(); } }