Threads sur un serveur J2EE ? Thread en tant que Singleton?

Threads sur un serveur J2EE ? Thread en tant que Singleton? - Java - Programmation

Marsh Posté le 09-05-2006 à 10:44:56    

Rapidement, le contexte : sur un serveur J2EE, je doit pouvoir lancer un thread qui scrute un répertoire pour repérer l'arrivée de nouveaux fichiers et faire... des trucs avec.
 
Je pensait donc lancer le thread avec un plugin struts, et le controller (start/stop) avec une page web à la con.
 
En écrivant le message, je suis en train de penser que mon thread est un singleton, et je me demande si je me suis pas un peu emballé là.

Code :
  1. public class FolderScan extends Thread {
  2. private static final FolderScan INSTANCE = new FolderScan();
  3. private FolderScan() {
  4.  setName("FolderScan" );
  5. }
  6. public static FolderScan getInstance(){return INSTANCE;}
  7. private boolean running;
  8. public void run() {
  9.  while (running) {
  10.   ...
  11.  }
  12. }
  13. public synchronized void start() {
  14.  super.start();
  15.  LOG.info(Messages.getString("scan.ctrl.started" ));
  16. }
  17. public synchronized void stopIt(){
  18.  setRunning(false);
  19.  LOG.info(Messages.getString("scan.ctrl.stopped" ));
  20. }
  21. }


Ca se fait ça, ou pas trop en fait ?
 
Enfin, quoi qu'il en soit, impossible de lancé le thread :

Code :
  1. if (!FolderScan.getInstance().isAlive()) {
  2. FolderScan.getInstance().start();
  3. }


Le isAlive() passe, mais le start tue le serveur sans message dans sysout ou syserr. J'ai testé avec JOnAS et WAS6.
 
edit: j'ai changé le titre, parce que j'ai testé ça comme code :

Code :
  1. public class ScanController extends DispatchAction {
  2. private boolean running;
  3. private Thread test = new Thread(){
  4.  public void run() {
  5.   while(running){
  6.    System.out.println("je tourne..." );
  7.   }
  8.  }
  9.  public synchronized void start() {
  10.   running = true;
  11.   super.start();
  12.  }
  13. };
  14. private Thread getFolderScan() {
  15.  return test;
  16. }
  17. public ActionForward start(ActionMapping mapping, ActionForm form,
  18.   HttpServletRequest request, HttpServletResponse response) throws Exception {
  19.  if (!getFolderScan().isAlive()) {
  20.   getFolderScan().start();
  21.  }
  22.  return mapping.findForward("scanCtrl" );
  23. }
  24. public ActionForward stop(ActionMapping mapping, ActionForm form,
  25.   HttpServletRequest request, HttpServletResponse response) throws Exception {
  26.  if (getFolderScan().isAlive()) {
  27.   running = false;
  28.  }
  29.  request.setAttribute("message", "scan.ctrl.stopped" );
  30.  return mapping.findForward("scanCtrl" );
  31. }
  32. }


 
donc du coup, je vois bien que c'est de faire des threads singletons qui fait merdoyer le truc... mais du coup, je vois pas trop comment gérer ce thread de scan... vais chercher...


Message édité par brisssou le 09-05-2006 à 11:46:43

---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 09-05-2006 à 10:44:56   

Reply

Marsh Posté le 09-05-2006 à 12:14:23    

tu ne "peux pas" créer de threads en j2ee. cfr la spec.
certains serveurs te laissent faire, pas tous.
une des solutions alternative c'est un ejb-timer (ejb2.1 je crois?) ou un mbean schedulé (ça je sais pas si ça existe en dehors de jboss, j'imagine que d'autres solutions propriétaires existent)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 09-05-2006 à 12:18:35    

C'est bizarre que le serveur meurt, au mieux il doit créer le thread et ça ne posera pas de problème outre mesure (si ce n'est pas pour le rédéploiement à chaud), au pire le serveur devrait lever une exception à la création du thread.

Reply

Marsh Posté le 09-05-2006 à 13:14:55    

et pourtant... bon, ben je regarde du cotédes EJB alors... fait chier, j'y entrave que dal aux EJB... c'est l'occasion...


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 09-05-2006 à 13:26:51    

kestufous sur un jonas ou was si tu fais que du web?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 09-05-2006 à 13:33:37    

s'pas moi que j'choisis les serveurs d'applications :o
 
chui plus struts/hibernate moi. Après, JCA, EJB, JMS, WebServices... j'ai pas encore pratiqué. Mais kekchoz me dit qiue ça va pas tarder...


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 09-05-2006 à 14:35:15    

désolé de te demander ça, ne me jète pas tout de suite...
 
Mais en fait, je viens de chercher pas mal sous Google, et je trouve pas grand chose sur ejb-timer.... (et là, tu me sors une super recherche qui sort 500 miyons de résultats...). Et comme tu semblais dire que c'est une des solutions altérnatives, est-ce que tu pourrais me dire quelles seraient les autres ?
 
Ce que je voudrais, c'est un un thread  qui démarre avec l'application J2EE et qui donc scrute un répertoire (fais des trucs en somme, ça j'en ferai mon affaire, quand même). Si je peut avoir un contrôle sur on/off, c'est cool, mais pas indispensable.
 
Sinon, je pense regarde du coté des jobs scheduler, genre quartz...
 
merci de ton aide !


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 09-05-2006 à 14:40:29    

* la spec dit que tu peux pas démarrer de thread toi même (pour la bonne et simple raison que les threads sont poolés par ton A.S et que si tu commences à créer tes propres threads, c'est la porte ouverte à toutes les fenêtres)
* http://www.google.com/search?q=ejb%20timer
* une des, parce que, comme dit, tu peux aussi scheduler l'execution d'mbeans (jmx donc) avec jboss (et peut-être d'autre)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2006 à 16:47:50    

Pour le déploiement je te suggère de lancer et de stopper cette tache en utilisant un ServletContextListener.
 
Je demande à voir un serveur d'appli qui bloque l'exécution de threads, à mon avis t'emmerde pas avec des mbean/ejb ou autre et fais un truc simple avec un bon vieux thread des familles. Je pense que ce qui est déconseillé c'est de lancer un nouveau thread suite à une requete, dans une action Struts par exemple, parce que le serveur utilise généralement des ThreadLocale pour attacher des informations de contexte (une transaction par exemple) au Thread en cours. En démarrant un nouveau thread on perd ces informations ce qui peut vite poser problème. Mais là pour une simple tache de fond je vois pas de mal à lancer un Thread.


---------------
Commons Configuration - http://jakarta.apache.org/commons/configuration
Reply

Marsh Posté le 10-05-2006 à 17:02:15    

Smanux a écrit :

Je demande à voir un serveur d'appli qui bloque l'exécution de threads


serveur d'appli j2ee != moteur de servlet
c'est "interdit" par la spec ejb(ou j2ee, enfin), autorisé par la spec servlet; et comme il l'a mentionné il utilise (va savoir pourquoi) un serveur d'appli ejb complet ...

Message cité 1 fois
Message édité par the real moins moins le 10-05-2006 à 17:02:38

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2006 à 17:02:15   

Reply

Marsh Posté le 10-05-2006 à 17:49:32    

S'il n'utilise que des servlets dans son serveur d'application complet je vois pas le problème non plus.


---------------
Commons Configuration - http://jakarta.apache.org/commons/configuration
Reply

Marsh Posté le 10-05-2006 à 18:02:12    

ben, le serveur aime pas [:el g]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 10-05-2006 à 19:04:09    

Topic intéressant, en cherchant un peu je suis tombé sur ca Work Manager API :  
Comme le dit --  l'article raconte qu'il est déconseillé d'ouvrir un thread indépendant au sein de son serveur EE et qu'une alternative peut etre le work manager :
http://www.devx.com/Java/Article/28815
 
Quelqu'un connait ?


Message édité par sebi le 11-05-2006 à 11:39:55
Reply

Marsh Posté le 11-05-2006 à 10:44:14    

the real moins moins a écrit :

serveur d'appli j2ee != moteur de servlet
c'est "interdit" par la spec ejb(ou j2ee, enfin), autorisé par la spec servlet; et comme il l'a mentionné il utilise (va savoir pourquoi) un serveur d'appli ejb complet ...


 
euh... remarque peu constructive.  
chui pas décideur, mais juste développeur. spa moi qui choisit le serveur d'appli.


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 11-05-2006 à 12:18:07    

et ?  


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 11-05-2006 à 14:48:31    

et tout ça pour dire que quartz fait ce que je veut


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Sujets relatifs:

Leave a Replay

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