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

Java Discussion :

Problème d'attente de fin de process


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Par défaut Problème d'attente de fin de process
    Bonjour a tous,
    j'ai une méthode qui doit faire des dizaines de SVN checkout.

    J'effectue ces checkout via un Runtime.exe et j'attend la fin du process externe via un Process.waitFor .

    Malheureusement le waitFor ne fini jamais.
    Avez vous une idée du problème ?

    Je vous remercie par avance pour votre aide.

    PS: Le source de la methode

    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
     
    private static void checkout(ArrayList<String> svnAllUrl, File workingDir) {
     
    		if ( workingDir.exists() && workingDir.isFile() ) {
    			System.err.println("-------------------------------------------------");
    			System.err.println("-- Error not a directory : " + workingDir.getAbsolutePath());
    			System.err.println("-------------------------------------------------");
    			System.exit(-1);
    		}
     
    		if ( !workingDir.exists() )
    			workingDir.mkdirs();
     
    		Runtime runtime = Runtime.getRuntime();
     
    		for ( String svnUrl : svnAllUrl ) {
    			String[] cmdarray = { "svn", "checkout", svnUrl };
    			try {
    				System.out.println("-- Checkout: " + svnUrl);
    				Process p = runtime.exec(cmdarray, null, workingDir);
    				p.waitFor();
    			}
    			catch ( IOException | InterruptedException e ) {
    				e.printStackTrace();
    			}
    		}
    	}

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu ne traites pas les flux d'entrée/sorties, ce qui peut provoquer un dead-lock.
    En effet il y a de forte chance que ta commande se retrouve bloqué lors d'une écriture sur sa sortie standard en attendant que ton programme traite les données... alors que ton programme attend la fin du process.

    Bref les deux process attendent mutuellement...

    Solution : traiter (ou fermer) les flux d'entrée/sorties.
    A partir de Java 5 on privilégiera le ProcessBuilder qui permet de rediriger le flux d'erreur dans le flux standard (ce qui permet de ne traiter qu'un seul flux).
    Avec Java 7 on peut même utiliser inheritIO() de ProcessBuilder pour que les flux du process soit hérité du programme Java (il devient alors inutile de les traiter).


    a++

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Par défaut
    Ah, cela explique tout.
    Je pensai (un peux naïvement certes) que si je ne gérai pas les flux, ils étaient redirigé vers un /dev/null sauce java.

    Donc après gestion des flux et passage sur un ProcessBuilder, aucun problème

    Merci pour ton aide

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

Discussions similaires

  1. ShellExecute n'attend pas la fin du process
    Par david11001 dans le forum C++
    Réponses: 2
    Dernier message: 22/09/2007, 12h02
  2. Réponses: 11
    Dernier message: 05/09/2007, 18h23
  3. Attente de fin d'éxécution avant "mv"
    Par lodilodi dans le forum Linux
    Réponses: 1
    Dernier message: 02/04/2007, 15h49
  4. Problème de lecture de fin de fichier (eof(fichier))
    Par jailbomba dans le forum Pascal
    Réponses: 2
    Dernier message: 21/02/2007, 16h50
  5. [Process]fin de process
    Par alex'l dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 29/09/2005, 15h00

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