Method init() de Tomcat executé deux fois ?! [RESOLU]

Method init() de Tomcat executé deux fois ?! [RESOLU] - Java - Programmation

Marsh Posté le 30-01-2004 à 09:58:06    

Bonjour a tous,
 
Je rencontre un probleme avec une application fonctionnant sous Tomcat 4.
 
Dans le web.xml, un element "loadonstartup" permet d'initialiser certaines servlets...
Le probleme, c'est que ces servlets crées des threads etc....
 
Je me suis aperçu que certaines threads etaient en double et donc que:
 
La methode init est appellé deux fois ( j'ai tracé avec un ID )...
 
Est-ce deja arrivé a quelqu'un ici ? Je ne vois vraiment pas comment ca peut arriver ...


Message édité par bartleby le 03-02-2004 à 14:25:25
Reply

Marsh Posté le 30-01-2004 à 09:58:06   

Reply

Marsh Posté le 30-01-2004 à 10:09:59    

en effet ce n'est pas possible ...  
La méthode init peut être appelée plusieurs fois, mais seulemetn si la méthode destroy est appelée auparavant ... (ce qui arrive quand le context est arrêté puis relancé)
 
Ca vient surement d'une erreur de ta part ailleur ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 30-01-2004 à 10:14:58    

Salut,
 
Tomcat utilise un pool de Threads pour augmenter les performances de traitement, ainsi une Thread peut être utilisée pour plusieurs traitements. Si Tomcat doit réaliser 2 traitements en parallèle, il utilise 2 Thread différentes en même temps. Mais s'il doit réaliser 2 traitements séquentiellement, par exemple 2 init de servlet (qui se font forcément séquentiellement), il prend la première Thread libre de son pool, exécute le premier traitement, remet le thread dans le pool, le reprend pour faire le 2ème traitement, le réalise et remet le thread dans le pool. En fait, il faut penser qu'un thread peut servir à plusieurs traitements.
Donc si tu vois dans tes traces qu'un thread est exécuté plusieurs fois, celà ne signifie pas que ton init s'est réalisée plusieurs fois.
 
A+.

Reply

Marsh Posté le 30-01-2004 à 11:00:33    

Hm, je me suis mal exprimé.
La méthode init de ma servlet instancié un thread qui recupere des informations regulierement.
Il instancie egalement un pool de connexion (ds une hashmap, donc pas grave car GarbageCollecté).
 
C'est en observant le rafraichissement des données que je me suis apercu que 2 threads avaient été crées . J'ai tracé et je confirme bien que c'est la methode init de la servlet qui est lancé deux fois....il n'y a pas d'erreurs la dessus :(...

Reply

Marsh Posté le 30-01-2004 à 11:13:14    

bartleby a écrit :

C'est en observant le rafraichissement des données que je me suis apercu que 2 threads avaient été crées . J'ai tracé et je confirme bien que c'est la methode init de la servlet qui est lancé deux fois....il n'y a pas d'erreurs la dessus :(...


 :heink:  
 
Le problème c'est que c'est pas possible  ...
tu l'as bien déclarée qu'une fois dans le web.xml ??


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 30-01-2004 à 17:42:18    

Oui :( !
 
C'est dommage que l'informatique ne soit jamais une science exacte avec moa!

Reply

Marsh Posté le 30-01-2004 à 18:01:24    

Dans ton init, ajoute ca et balance les traces !

Code :
  1. System.out.println("servlet-name : " + this.getServletName());
  2. new Exception().printStackTrace(System.out);


Ca m'intrigue ton histoire !


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 30-01-2004 à 18:18:01    

Sinon pour ce que tu veux faire, tu peux utiliser un ServletContextListener (ou quelquechose comme ça), pour déclencher un traitement à la création de ton contexte. C'est plus propre que loadonstartup.

Reply

Marsh Posté le 30-01-2004 à 21:13:42    

R3g a écrit :

Sinon pour ce que tu veux faire, tu peux utiliser un ServletContextListener (ou quelquechose comme ça), pour déclencher un traitement à la création de ton contexte. C'est plus propre que loadonstartup.

[:bien] :)


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

Marsh Posté le 30-01-2004 à 21:15:47    


mais attendez un peu avant de lui donner la bonne méthode, je veux comprendre son machin, moi :o


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 30-01-2004 à 21:15:47   

Reply

Marsh Posté le 30-01-2004 à 21:19:43    

benou a écrit :


mais attendez un peu avant de lui donner la bonne méthode, je veux comprendre son machin, moi :o

bah ça ne devrait rien changer au problème, à moins qu'il y ait effectivement un probleme du coté de tomcat


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

Marsh Posté le 03-02-2004 à 14:23:04    

Bon, nous avons trouvé d'où venait le probleme.
Dans le sous repertoire WebApps, j'avais mon application ( normal).
J'avais crée un virtual Host à la racine ( http://machin:8080) vers le repertoire dans webapps:
 
Context : machin => /webapps/MaWebApps.
 
Ce que je ne savais pas, c'est que TomCat initialisait les servelts et tout et tout, pour CHAQUE context!
On m'avait dis: "Ouais c'est comme un alias" et comme un con j'avais pas lu la doc :[ !
C'est certainement ce que vous vouliez me dire quand vous me demandiez si je n'avais pas déclaré ma webapp deux fois. Je pensais "web.xml" et pas "server.xml".
 
La solution: La webapps n'est plus dans le repertoire "webapps", le context est toujours present, mais pointe desormais vers le nouveau repertoire.
 
Désolé, je vais me faire sepuku de ce pas :D !


Message édité par bartleby le 03-02-2004 à 14:25:00
Reply

Marsh Posté le 03-02-2004 à 15:07:24    

ok :)
 
tout s'explique :)


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 25-04-2005 à 17:53:28    

bonjour j'ai le meme probleme que toi mais je n ais pas tres bien compris la solution pourrais tu m'eclairer merci

Reply

Sujets relatifs:

Leave a Replay

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