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 :

Servlet et Thread non exécutée


Sujet :

Servlets/JSP Java

  1. #1
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut Servlet et Thread non exécutée
    Bjr,
    A partir d'une carte miniPC disposant de nombreuses E/S et fonctionnant sous Linux, je veux afficher les états des entrées dans une page web. J'ai donc installé java et Tomcat.
    Au point de vue code, j'ai pour l'accés direct aux entrées la classe Gpio https://github.com/MohammadAdib/GPIO.../GPIO_Pin.java
    J'ai ensuite un objet DataBean qui effectue le lien entre les valeurs des E/S et l'affichage de la page :
    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
    public class DataBean {
        private int PIN_0 = 0;
    .....
        private Gpio pinZero;
    .....
        private String valeurPinZero ;
    .....
       public DataBean(){
            pinZero = new Gpio(PIN_0);
            pinZero.setModeINPUT();
    .....
    }
    // setters pour mise à jour
        public void setValeurPinZero() {
           valeurPinZero = pinZero.getPinStatus();
        }
    ...
    // getters pour affichage page jsp
        public String getValeurPinZero() {
            return(valeurPinZero);
        }
    ...
    Indépendamment de l'affichage, je mets à jour la variable de type DataBean toutes le 3 secondes, je crée donc un Thread Acquisition
    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
    public class Acquisition extends Thread {
        private DataBean dataInput;
     
        public void referenceBean(DataBean db){
            dataInput = db;
        }
     
        @Override
        public void run(){
            while (this.isAlive()) {
                synchronized (dataInput){
                    dataInput.setValeurPinZero();
                    .....
                }
                try {
                    this.sleep(3000);
                }
                catch (InterruptedException ex) {}
            }
        }
    }
    Et tout celà géré au niveau d'une servlet ServletIO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        public void init(ServletConfig c) throws ServletException {
            context = c.getServletContext();
            db = new DataBean();
            // Création du thread
            th = new Acquisition();
            th.referenceBean(db);
            th.start();
    }
        protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            request.setAttribute("data", db);
            context.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
    }
    Et lors de l'éxécution de l'application, si je crée bien une instance de DataBean avec ses initialisations, il me semble que le thread n'est pas exécuté : il est certain que je ne passe pas dans la méthode run().
    Comme je n'ai pas trop l'habitude des threads, je ne sais pas trop ou chercher.
    Peut-être faut-il un paramètrage de Tomcat pour l'éxécution des threads?
    Et lors de l'arrêt de Tomcat, que faut-il mettre dans la méthode destroy() de la servlet pour supprimer le thread?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Plusieurs remarques:
    dans le init de la servlet, tu dois appeler le init du parent. C'est obligatoire dans la spec.
    the while isAlive ne sert à rien, tant que tu es dans le run, le thread est alive. Alive ne peux pas passer false pendant que le run tourne.
    Qu'est-ce qui te fais dire que tu ne rentre pas dans run?
    Pour l'arrêt, tu dois remplacer ton while par un while qui teste un boolean, et quand tu arrête ton tomcat tu fais passer ce boolean à false. Aussi n'oublie pas de déclarer ce boolean comme volatile.

  3. #3
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Merci pour la réponse.
    Donc la servlet ServletIO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        public void init(ServletConfig c) throws ServletException {
           super.init(c);
           .....
    Pour vérifier le passage dans run(), j'ai donné des valeurs d'initialisation et effectué quelques modifs afin d'être indépendant des E/S ;
    Dans DataBean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        private String valeurPinZero = "init0";
        private String valeurPinUn = "init1";
        .......
    
        public void setValeurPinZero() {
            valeurPinZero = pinZero.getPinStatus();
        }
    
        public void setValeurPinUn(String st) {
            valeurPinUn = st;
        }
    Et dans le thread Acquisition :
    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
    public class Acquisition extends Thread {
        private DataBean dataInput;
        private boolean exit = false;
        
        public void referenceBean(DataBean db){
            dataInput = db;
        }
        
        @Override
        public void run(){
            while (!exit){
                synchronized (dataInput){
                    dataInput.setValeurPinZero();
                    dataInput.setValeurPinUn("passage dans run");
                    ......
                }
                try {
                    this.sleep(3000);
                }
                catch (InterruptedException ex) {}
            }
        }
        
        public void stopThread(){
            exit = true;
        }
    }
    J'ai également ajouté la méthode stopThread() qui sera appelée à partir de la méthode desrtoy() de la servlet.
    Et malgré celà, je ne passe toujours pas dans run() : dans la page jsp,les valeurs d'init ("init0" et "init1") sont affichées alors qu'après activation du thread je devrais afficher ([valeur Entrée_0] et "passage dans run").
    Il se fait tard et je ne vois plus les erreurs.
    L'application est développée sur mon PC et "uploadée" sur la cible (ssh). Demain, je reconstitue l'appli, mais cette fois expurgée de l'aspect E/S; de cette façon, elle pourra s'exécuter indifféremment sur le PC ou sur la cible : celà permettra de voir s'il y a différence de comportement.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Met un breakpoint dans ton run.

    Si le thread ne démarre pas c'est que la servlet n'est pas démarrée.

  5. #5
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par tchize_
    Si le thread ne démarre pas c'est que la servlet n'est pas démarrée.
    Exact.

    Et c'est quand même plus facile de développer sur PC que sur cible ou l'on n'a pas de debbuger.
    Donc après avoir enlevé tout ce qui était spécifique à la cible, le debug m'a permis de voir que la servlet n'était pas démarrée à cause d'une erreur d'inattention.
    Habituellement mes pages jsp sont dans WEB_INF, mais comme je n'avais qu'une page, je n'ai pas spécifié de répertoire et Netbeans l'a mise à la racine du projet et en plus avec index.jsp comme nom. Pas étonnant que la servlet ne soit pas activée lors de la demande de page.

    De plus il n'y avait pas conformité avec la déclaration dans la servlet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           context.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
    Si la page n'est pas dans WEB_INF, on ne l'appelle pas index.jsp mais affichage.jsp et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           context.getRequestDispatcher("/affichage.jsp").forward(request, response);
    Merci.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Le remote debugging est ton amis pour ce genre de situation

  7. #7
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Remote debugging : pas mis en pratique; à explorer et certainement très utile.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Surtout que tu as juste à ajouter ça aux arguments de java sur le serveur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n

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

Discussions similaires

  1. Contenu servlet non exécuté
    Par NicoTheDude dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 06/07/2011, 09h52
  2. Réponses: 18
    Dernier message: 06/11/2010, 17h09
  3. [Service][DLL][Thread] Exécution d'un thread non effective
    Par homeostasie dans le forum Windows
    Réponses: 11
    Dernier message: 18/09/2008, 16h06
  4. [MySQL] Requête non exécutée
    Par harlock59 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 03/05/2006, 15h42
  5. INCLUDE non exécuté
    Par Sadneth dans le forum ASP
    Réponses: 3
    Dernier message: 07/09/2003, 00h44

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