Bonjour,
Je veux démarrer un thread au lancement de tomcat pour des calculs de statistiques sur les logs de l'appli.
Pour ce faire, j'utilise la balise <load-on-startup> pour démarrer ma servlet au lancement de tomcat. Tous ce passe bien, puisque ma méthode init de ma servlet est appelée. Dans cette méthode je démarre mon thread et log cette info dans le FileLogger de catalina (tomcat).
J'ai fait de mon thread un singleton pour m'assurer qu'une seule instance est lancée. Dans ce thread, je cherche le répertoire de log que catalina utilise pour y extraire les fichiers de log et faire donc mes stats dessus avec la méthode suivante:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
private String getRepLog() throws TecException{
try {
FileLogger fl = new FileLogger();
if(fl == null) throw new TecException("Impossible de lire les logs", e);
return Params.serverBase + File.separator + fl.getDirectory();
} catch(Error er){
er.printStackTrace();
throw new TecException("Impossible de lire les logs", er);
}
} |
Pb, sur la console j'ai le message ci-dessous, qui vient de l'appel de la méthode getRepLog(), et pourtant mon thread travail bien et j'obtient mes résultats:
java.lang.NoClassDefFoundError: org/apache/catalina/logger/FileLogger
En debuggant, j'ai remarqué que la méthode init de la servlet est en fait appelée deux fois au cours du démarrage de tomcat. J'ai donc ajouté un compteur static dans mon thread pour voir dans quel appel le problème se pose (un static int que j'incrémente a chaque new de mon thread). Il s'agit du numéro ci-dessous.
1 2 3 4 5 6 7
|
INFO: Processing Context configuration file URL file:./config.xml
15 févr. 2006 16:37:44 org.apache.catalina.core.StandardHostDeployer install
** Methode inti de la servlet appelee, et lancement du thread numero 1 **
INFO: Installation d'une application pour le chemin de contexte /webapp depuis l'URL file:./webapp
15 févr. 2006 16:37:44 org.apache.coyote.http11.Http11Protocol start
** Methode inti de la servlet appelee, et lancement du thread numero 1 ** |
Comme on peut le voir le numéro reste à 1 pourtant il est stocké dans une variable static donc logiquement commune à toutes les instances de ma classe. J'ai l'impression que le serveur démarre en deux temps dans deux zones de mémoires distincts.
Est-ce que qq1 peut m'éclairer la dessus pour mieux comprendre les phases de démarrage du serveur et éviter alors ce genre de problème?
PS: même si ça ne perturbe ni mon thread ni mon appli, je trouve ça génant car ça rempli le catalina.out.
[Modéré par Didier] : ajout de tag dans le titre - Les règles du forum Java
Partager