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]Exec et singlethreadmodel


Sujet :

Servlets/JSP Java

  1. #1
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 79
    Points : 54
    Points
    54
    Par défaut [servlet]Exec et singlethreadmodel
    Bonjour.
    J'ai besoin sur mon site d'utiliser la fonction exec de java qui permet de lancer une commande extérieur (dans mon cas un programme C).
    J'utilise cette fonction dans une servlet.
    En testant je me suis rendu compte que je n'arrivais à lancer qu'un seul programme C à la fois (lancement séquentiel).
    Voila ma méthodologie de test :
    -prog C avec param à 1 : aucun sleep
    -prog C avec param à 3 : sleep de 10 sec
    2 pc pointant sur mon site avec la servlet d'essai.
    1er pc lance le prog C avec param à 3 (résultat attendu 10 secondes plus tard)
    2eme pc lance le prog C avec param à 1 juste après (1 seconde de délai en gros, résultat immédiat normalement)

    Les exec sont bien lancé dans des threads séparés de la servlet mais ca ne marche toujours pas.
    J'ai le résultat du 3 AVANT le résultat du 1.
    Je pense avoir réussi cerner le problème : en fait l'utilisation d'exec a l'air de bloquer l'instance de ma servlet (pour etre exact c'est plutot l'utilisation de l'inputreader d'ailleurs, exec seul je n'ai pas de problème).
    Si je lance ces programmes dans deux servlets différentes ca marche.
    J'ai donc redéfini ma servlet d'essai avec SingleThreadModel.
    Et la ca marche comme je le voudrais.
    Mais d'après tout ce que j'ai lu l'utilisation de cette méthode est TRES déconseillée...
    Est ce que quelqu'un aurait une piste pour résoudre mon problème ?

    Merci d'avance

  2. #2
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 79
    Points : 54
    Points
    54
    Par défaut
    Personne ne peut m'aider ?
    je bloque toujours sur le meme problème

    voila un extrait du code que j'utilise :
    (c'est pour des tests donc pas forcément tres propre...)

    La servlet :
    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
     
    try {
       String chaine;
       Runtime rt = Runtime.getRuntime();
       Process proc = rt.exec("cmd /C D:\\temp\\tempC\\test.exe "+mAr.getNno());
       TestThread t = new TestThread(proc.getInputStream());
       t.start();
       proc.waitFor();
       proc.getInputStream().close();
       chaine = t.donneResult();
       System.out.println("Test console ->"+mAr.getNno()+"<-->"+chaine+"<-\n");
       RequestDispatcher rd;
       rd = this.getServletContext().getRequestDispatcher("/test.jsp?chaine2="+chaine);
       rd.forward(aRequest, aResponse);
    }catch (Throwable t){
       t.printStackTrace();
    }
    et le thread avec les entrees/sorties :
    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
     
    public class TestThread extends Thread {
         InputStream is;
         String result; 
         public TestThread(InputStream is) {
              this.is = is;
              result = "";
         }
         public void run() {
           try{
              InputStreamReader isr = new InputStreamReader(is);
              BufferedReader br = new BufferedReader(isr);
              String line=null;
              while ((line = br.readLine()) !=null){
                    result = result + line;
              }
           }catch(IOException e) {
              System.out.println("IOException 1 :"+e);        
           }         
         }
         public String donneResult(){
            return result;
         }
    }
    J'ai essayé en elevant le waitfor dans ma servlet et du coup je n'ai plus de blocage mais bien entendu ca plante avec cette exception "IOException 1 :java.io.IOException: Stream closed"

    On dirait que le waitFor qui ne devrait bloquer que le thread où il s'execute bloque également l'execution d'autre thread sur cette servlet.

  3. #3
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 79
    Points : 54
    Points
    54
    Par défaut
    J'ai trouvé...
    ma servlet etait en synchronized... honte sur moi

    Problème résolu donc.

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

Discussions similaires

  1. Runtime.getRuntime().exec(command) à partir d'une servlet
    Par cotede2 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 04/05/2009, 16h26
  2. Servlet avec Runtime.getRuntime().exec(. . .)
    Par enzyme59 dans le forum Servlets/JSP
    Réponses: 13
    Dernier message: 22/05/2008, 17h54
  3. [Servlet][Windows][System call]Runtime.exec
    Par lucho31 dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 18/01/2005, 11h55
  4. [JSP/Servlet] Outils pour developper?
    Par BenoitM dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 04/05/2004, 11h03
  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