Laisser tourner un thread en fin de session

Laisser tourner un thread en fin de session - Java - Programmation

Marsh Posté le 10-09-2009 à 17:47:32    

Bonjour,

 

voila, je voudrais que mon appli web (qui tourne sur jboss) lance une tache tous les jours.

 

Pour cela j'ai fait une classe Reveil du type TimerTask

 

public class Reveil extends TimerTask {

 

   private volatile boolean continuer = true;
   
    public Reveil(){
        continuer = true;
    }
    public void stopper(){
        continuer = false;
    }
    public void executer(){
        try {
              (tache à effectuer...)
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

 

   public void run() {
    while (continuer) {
      executer();
   
    }
  }

 

J'invoque Reveil dans une Action, et pour pouvoir le stopper je le place en session.

 
 

public class ReveilAction extends Action {
    public ActionForward execute(ActionMapping mapping, ActionForm form,
                                    HttpServletRequest request,
                                    HttpServletResponse response) {
...
        Timer t = new Timer();
        Reveil r = (Reveil) request.getSession().getAttribute("reveil" );
            if(r==null){
            r = new Reveil();
            request.getSession().setAttribute("reveil",r);
            }
            GregorianCalendar gc = new GregorianCalendar();
            gc.add(Calendar.DAY_OF_YEAR, 1);
            t.scheduleAtFixedRate(r, gc.getTime(), 1);
...

 
 

et je l'arrête avec :

 


r.stopper();
System.out.println("reveil off" );

 

Je peux la lancer, l'arrêter, c'est cool.

 

Mais ce que je voudrais c'est que quand la session s'acheve, cette tache continue de tourner.

 

Est ce possible ?

 

Est ce que je peux placer la variable r comme variable d'application pour qu'elle reste en mémoire quand je me déconnecte ?

 

merci

 

a+


Message édité par Gilgamesh d'Uruk le 10-09-2009 à 18:18:50

---------------
Nation spatiale : la chaîne de l'Arche interstellaire.
Reply

Marsh Posté le 10-09-2009 à 17:47:32   

Reply

Marsh Posté le 11-09-2009 à 01:03:47    

Salut,
 
Je pense que cet article pourrait t'aider (ton cas est un peu différent puisque c'est une action de l'utilisateur qui lance la TimerTask et ensuite il faut garder sa référence pour pouvoir l'arrêter).
 
En gros tu dois stocker ton instance de Reveil directement dans ta servlet et pas dans ta session. Tant que ta servlet tourne, l'action de la TimerTask continuera à s'exécuter. Si tu en as plusieurs à faire tourner, par exemple une par utilisateur, tu peux les stocker dans une hashmap par exemple.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed