IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

Exécuter une tâche en "arrière plan" dans un container web


Sujet :

Servlets/JSP Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    mars 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2006
    Messages : 10
    Points : 10
    Points
    10
    Par défaut Exécuter une tâche en "arrière plan" dans un container web
    bonjour à tous,

    J'aimerais savoir s'il est possible d'exécuter une tâche de manière continue dans un container web (depuis le lancement jusqu'à l'arrêt de celui-ci), indépendamment du cycle de vie de la Servlet ?

    Exemple : j'ai un "démon" (opérations dans une boucle sans fin) et je veux une interface web qui indiquerait l'état de ce démon et/ou permettrait de changer les paramètres dans l'exécution de celui-ci.
    Si je lance mon démon depuis la méthode init() de ma Servlet :
    - Premièrement, est-ce qu'il est possible de lancer une Thread (ou autre chose) depuis une Servlet ?
    - Ensuite, le démon ne se lancera qu'après que le container web ait appelé la méthode init() de ma Servlet, donc a priori, après la première connexion d'un client sur cette Servlet, alors que j'aimerais que mon démon se lance en même temps que le container web,
    - Enfin, lorsque le container web aura jugé que ma Servlet doit disparaître (et qu'avant il appelle la méthode destroy() ), il y a des chances pour que mon démon s'arrête aussi, non ?

    Une solution (compliquée) serait que mon démon tourne dans un process séparé et que j'ai un moyen de communication entre ce process et ma servlet...mais la communication inter-process, c'est jamais simple.
    Est-ce qu'il n'y aurait pas une solution plus simple, dans laquelle l'espace mémoire de mon démon et celui de ma Servlet serait partagé ?

    Par avance, merci de votre aide

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2006
    Messages : 3 274
    Points : 4 166
    Points
    4 166
    Par défaut
    Regarde du côté des listeners à déclarer dans ton web.xml et plus particulièrement du côté de la classe ServletContextListener.
    Tu pourras lancer un thread à partir de la méthode d'initialisation de contexte.
    Tu trouveras des infos à ce sujet dans la faq.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    mars 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2006
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup, c'est exactement ce que je cherchais.
    Petit exemple pour ceux que ça intéresserait :

    La classe qui implémente "ServletContextListener" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class MyServletContextListener implements ServletContextListener {
     
        private Thread thread = null;
     
        public void contextInitialized(ServletContextEvent sce) {
            if ( (thread == null) || (thread.isAlive() == false) ) {
                thread = new Thread(new Runnable() {
                    @Override public void run() {
                        //some task...
                    }
                });
                thread.start();
            }
        }
     
        public void contextDestroyed(ServletContextEvent sce) {
            if(thread != null)
                thread.interrupt();
        }
    }
    Et la "déclaration" de cette classe à ajouter dans le web.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <listener>
        <listener-class>com.package.MyServletContextListener</listener-class>
    </listener>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. code en c# pour exécuter une commande dos en arrière plan
    Par GhostMoon dans le forum Windows Forms
    Réponses: 2
    Dernier message: 31/03/2010, 09h48
  2. Exécuter une page PHP en arrière-plan
    Par sunseb7 dans le forum Langage
    Réponses: 1
    Dernier message: 13/12/2009, 19h51
  3. Exécuter une commande UNIX en arrière-plan
    Par sunseb7 dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2009, 10h08
  4. Réponses: 1
    Dernier message: 07/02/2006, 00h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo