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 :

Servlets et Destroy


Sujet :

Servlets/JSP Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 139
    Par défaut Servlets et Destroy
    Bonjour à tous,

    j'ai une question à propos de la commande Destroy des Servlets, j'ai cherché des réponses mais impossible d'y voir plus clair...

    J'ai une appli déployée sur Tomcat et lorsque j'arrête mon tomcat j'ai besoin d'arrêter proprement mes Threads qui tournent sur le serveur (j'en ai 2), donc je pensais m'appuyer sur la méthode destroy pour envoyer justement les demandes d'arrêt de mes Threads mais il semblerait que tomcat ne me laisse pas le temps !

    j'obtiens en fait des erreurs liées à l'utilisation de log4j (que j'utilise dans mon code) mais plus précisément des NullPointerException alors que je ne fais que demander des affichages dans les logs !

    de ce fait je voudrais savoir comment se passe la phase de destroy dans apache ? parce que à priori le serveur n'attend pas que le traitement de la méthode Destroy soit terminé pour arréter le serveur et j'ai même quelque fois mon process java qui continue à tourner alors que tomcat est arrété, ce qui veut dire que mes Threads tournent encore...

    quelqu'un pourrait m'éclairer ?
    Merci,
    Tiamat.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    d'abord, mettre tes threads en daemon (setDeamon(true)), ensuite nous afficher tes erreurs pourrait être utile. Il faut savoir que, au niveau de apache tomcat, lors du déchargement d'une webapp, tomcat invalide d'abord le classloader, ce qui signifie que les appels du style loadclass au classloader seront refusé.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 139
    Par défaut
    Salut tchize,

    merci pour l'info du setDeamon(true), j'ai rajoué ça mais à priori ça n'a pas corrigé mon problème.
    Je pense que cela provient de mon Thread lui même qui génère une erreur aléatoire lors du destroy de la servlet.

    voici donc l'erreur dans le catalina.out:

    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
    log4j:ERROR Error occured while converting date.
    java.lang.NullPointerException
            at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:485)
            at java.lang.StringBuffer.append(StringBuffer.java:301)
            at org.apache.log4j.helpers.AbsoluteTimeDateFormat.format(AbsoluteTimeDateFormat.java:124)
            at java.text.DateFormat.format(DateFormat.java:316)
            at org.apache.log4j.helpers.PatternParser$DatePatternConverter.convert(PatternParser.java:444)
            at org.apache.log4j.helpers.PatternConverter.format(PatternConverter.java:65)
            at org.apache.log4j.PatternLayout.format(PatternLayout.java:502)
            at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:302)
            at org.apache.log4j.WriterAppender.append(WriterAppender.java:160)
            at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
            at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
            at org.apache.log4j.Category.callAppenders(Category.java:206)
            at org.apache.log4j.Category.forcedLog(Category.java:391)
            at org.apache.log4j.Category.error(Category.java:305)
            at com.emi.module.USBCard.USBThread.run(USBThread.java:195)
     ERROR [USBCard] Erreur de Thread USB: java.lang.NullPointerException
    comme je disais elle est aléatoire et impossible pour le moment de trouver les raisons.

    je continue à creuser mais en tout cas merci pour ton aide.
    Tiamat.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    peux tu nous montrer le code à la ligne 195 ainsi que le le patternlayout utilisé par ton logger? Et quelle version de log4j utilise-tu?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 139
    Par défaut
    Salut,

    voici le code:
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    	public void run(){
    		while(fin != 1){
    			try{
    			cmd = getCommand();
    			log.debug("On a une commande recue....");
    			cmd.print();
    			//Si on est dans le cas d'une commande de sortie pour le Thread USB
    			if(fin == 1){
    				//on sort de la boucle d'attente sans traitement.
    				log.debug("Commande de Sortie du Thread USB");
    				break;
    			}
    			//on rajoute la commande dans la collection
    			addCommand(cmd);
    			//on envoit la commande a la carte USB
    			process();	
    			//on attend le Ack de la carte USB
    			String rec = getCommandAck();
    			Integer id = (int)rec.charAt(0);
    			if(id == Integer.parseInt(cmd.getSession_id())){
    				cmd.setValue(rec.substring(1));
    				cmd.setStatus(OperativeConstants.SUCCESS);
    				log.debug("ACK ["+cmd.getSession_id()+"]["+cmd.getCommand()+"]"+"]["+cmd.getStatus()+"]"+"]["+cmd.getValue()+"]");
    				//cmd.print();
     
    				if(cmd.getCommand().equals(OperativeConstants.LED1_ON))
    					XMLActuators.updateValue(ModuleActuators.LED1, cmd.getValue());
    				if(cmd.getCommand().equals(OperativeConstants.LED2_ON))
    					XMLActuators.updateValue(ModuleActuators.LED2, cmd.getValue());
     
    				//log.debug("Supression Commande dans collection");
    				deleteCommand(cmd);
    				printCommands();
    			}
    			else{
    				log.debug("Commande ACK Recue n'est pas la commande envoyee:"+id+"/"+cmd.getSession_id());
    			}
    			}catch(Exception e){
    					log.error("Erreur de Thread USB: "+e.toString());
    			}
    		}
    		log.debug("[USB Thread]: Fin USB Thread...");
    	}
    ...
     
    	protected OperativeCommand getCommand() {
    		try {
    			return this.queue.take();
    		} catch (InterruptedException e) {
    			log.debug("Erreur de GetCommand");
    			throw new RuntimeException(e);
    		}
    	}
    pour comprendre brièvement j'ai un Thread qui attend que l'on vienne le réveiller avec une réception de message dans une queue (via la méthode getCommand(), j'utilise une queue du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private final BlockingQueue<OperativeCommand> queue = new LinkedBlockingQueue<OperativeCommand>();
    en nominal le code tourne bien, par contre en condition de sortie (mise fin à 1 dans mon Thread pendant le destroy de la Servlet) j'ai cette fameuse NullPOinterException... la ligne 195 correspond à log.error("Erreur de Thread USB: "+e.toString()); qui n'est autre qu'un catch du while complet...

    Pour ce qui est des PatternLayouts les voicis:

    dans mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static final Logger log = Logger.getLogger("com.emi.module.USBCard");
    dans le log4j.xml correspondant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	<appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender"> 
    		<param name="File" value="${catalina.base}/logs/EMI.log" />
    		<param name="DatePattern" value="'.'yyyy-MM-dd"/>
    		<param name="Append" value="true"/>
    		<param name="Threshold" value="TRACE"/>
    		<layout class="org.apache.log4j.PatternLayout">
    		<param name="ConversionPattern" value="%d{HH:mm:ss:SSS} - %p - %C{1} - %m%n"/>
    		</layout>
    	</appender>
    je sais c'est un peu lourd à reprendre c'est pourquoi je voulais éviter de tout poster ! ;-)

    tout aide est la bienvenue !
    ++

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    une variable statique de log4j semble etre a null (previousTimeWithoutMillis), ce qui me fait penser au résultat du nettoyage des static par tomcat (les version récente de tomcat mettent à null les champs statique de toutes les classes chargée après l'arret de la webapp).

    Peux tu nous montrer le code que tu utilise poru arreter tes thread et surtout nous dire si, dans ton destroy, tu attends bien que tous les thread soient terminés (sortie du run) avant de rendre la main à tomcat ?

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

Discussions similaires

  1. [Servlets - JSP] Problème de session
    Par the java lover dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 28/11/2011, 09h54
  2. [JSP/Servlet] Outils pour developper?
    Par BenoitM dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 04/05/2004, 11h03
  3. [servlet][identification][url]
    Par welty dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 20/08/2003, 09h10
  4. [servlet] initialisation d'objets
    Par tiPouick dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 05/08/2003, 12h12
  5. Servlet dans Eclipse ?
    Par unflag dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/04/2003, 18h46

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