60 votes

Fil de fond pour une application de servlet Tomcat

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

Je suis à la recherche d'un moyen de lancer un contexte de thread lorsque un serveur Tomcat commence, ce qui permettrait de mettre à jour périodiquement le Contexte du Serveur (dans mon cas particulier, c'est un thread qui écoute les battements de cœur de certains autres services et mises à jour de la disponibilité de l'information, mais on peut imaginer une variété d'utilisations pour cela).

Est-il un moyen standard pour ce faire? À la fois le lancement et la mise à jour et l'interrogation du Contexte?

Les pointeurs vers les documents pertinents et/ou des exemples de code serait très apprécié.

79voto

Chris Thornhill Points 2538

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

 <web-app>
    <listener>
       <listener-class>com.mypackage.MyServletContextListener</listener-class>
    </listener>
</web-app>
 

Puis 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) {
        }
    }
}
 

12voto

Thilo Points 108673

Je suis à la recherche d'un moyen de lancer un thread d'arrière-plan lorsqu'un serveur Tomcat commence

Je pense que vous êtes à la recherche d'un moyen de lancer un thread d'arrière-plan lorsque votre application web est démarré par Tomcat.

Cela peut être fait à l'aide d'un ServletContextListener. Il est inscrit dans web.xml et sera appelée quand votre application est démarré ou arrêté. Vous pouvez ensuite créé (et d'arrêter plus tard) de votre Fil, à l'aide de la normale Java façons de créer un Thread (ou ExecutionService).

5voto

divbyzero Points 21

Mettre <load-on-startup>1</load-on-startup> dans le bloc <servlet> de votre web.xml forcera les init() de votre servlet à se produire dès le démarrage de Tomcat, plutôt que d’attendre la première requête. arriver. Ceci est utile si vous souhaitez générer le fil d’arrière-plan à partir de init() .

2voto

Ittai Points 1363

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 étant un thread démon par myThread.setDaemon(true); ce qui permettra de 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 machine virtuelle Java et vous n'avez pas besoin de le gérer vous-même dans contextDestroyed . Mais ce n'est que mes 2 cents.

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