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

Langage Java Discussion :

Création de processus en cascade à la fermeture d'une application


Sujet :

Langage Java

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Points : 213
    Points
    213
    Par défaut Création de processus en cascade à la fermeture d'une application
    bonjour

    j'ai développé un programme en java utilisant javaexe, un programme annexe qui me permets de transformer mon programme java en service et d'avoir un icône dans la barre des tâches.
    Mais ma question ne concerne pas cet aspect, ou peu : le problème est que lorsque je le "malmène" un peu (une ouverture, pas de confirmation que le service doit être lancé, et une deuxième ouverture suivie de la demande de fermeture de la première instance) ou peut-être même lorsque je l'utilise normalement (je dois réaliser des tests pour voir) après la fermeture j'ai un comportement bizarre : il ne se ferme pas (l'icône ne disparaît pas) et lorsque je lance le gestionnaire des tâches j'ai une dizaine, voire une vingtaine de processus ouverts en plus du service, et il s'en ouvre continuellement.

    je crois que cela provient de la méthode appelée à la fermeture du service; la voici :

    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
    54
    55
    56
    57
    58
    59
    60
    /**             * 1.fermetures
                 */
                SwingUtilities.invokeLater(new Runnable() {
     
     
                    @Override
                    public void run() {
                        // app
                        app.flag_end = true;
     
                        try {
                            // oracle
                            oracle.getConnexion().close();
     
     
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                        try {
     
     
                            // smstrend
                            smstrend.cnx_close();
     
     
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        try {
     
     
                            // sqlite
                            sqlite.connexion.close();
     
     
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
     
     
                    }
                });
     
     
                /**
                 * 2;exit
                 */
                SwingUtilities.invokeLater(new Runnable() {
     
     
                    @Override
                    public void run() {
                        Runtime runtime = Runtime.getRuntime();
                        try {
                            runtime.exec("SMS2.exe -deleteService");
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                });
    ma question est : savez-vous pourquoi il y a cette erreur? comment la corriger?

    merci

    olivier

  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
    Il y a trois manière principale d'arrêter un programme java:
    • un kill depuis l'extérieur. Ce n'est pas le cas ici, en général c'est en allant manuellement dans le gestionnaire de tâches, ou quand la jvm crashe
    • Quand tous les threads non-démon sont arrêtés. Si tu utilise des interfaces graphiques, toutes les fenêtres doivent être dispose() pour que le thread EDT s'arrête aussi
    • Quand tu fais un System.exit(int)



    Si ton processus tourne toujours, c'est que tu ne fais aucun des trois.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Points : 213
    Points
    213
    Par défaut
    bonjour Tchize_,

    j'ai bien compris, et je pense ajouter un System.exit(0), mais comment l'ajouter au code que j'ai fourni plus haut? je veux dire que je voudrais fermer les ressources proprement avant un System.exit.

    olivier

    ps : c'est peut-être le B.A-BA de la programmation java...

  4. #4
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 709
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 709
    Points : 4 790
    Points
    4 790
    Par défaut
    Ici à vue de nez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                    @Override
                    public void run() {
                        Runtime runtime = Runtime.getRuntime();
                        try {
                            runtime.exec("SMS2.exe -deleteService");
                            System.exit(0);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
    Cependant tu as 2 Runnable et je ne sais pas comment tu les lances
    Il n'y a donc pas de garantie que celui qui ferme Oracle se termine avant System.exit(0)

    Je pense que tu devrais tout rassembler dans un seul Runnable et mettre le System.exit(0) à la fin.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  5. #5
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Points : 213
    Points
    213
    Par défaut
    bonjour,

    j'ai suivi ton conseil (tous les close() dans un Runnable, avec un System.exit(0) à la fin) en créant en plus un flag qui évite que la méthode soit appelée plus d'une fois.
    mais lorsque je lance mon programme SANS connexion à la base Oracle, la méthode chargée de la création de la connexion tourne, tourne ... et ne semble pas s'arrêter.
    Y-a-t'il un moyen de stopper cette méthode au bout d'un certain temps, sachant que lorsque la liaison à la base existe (sous internet en gros) la connexion s'établit en quelques secondes?

    Voici la méthode de création de la connexion:

    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
    public boolean cnx_create() {
     
    		boolean correct = true;
    		try {
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    		} catch (ClassNotFoundException e1) {
    			launcher.append(launcher.format_log.format(new Date())+" Gestion_oracle : ERREUR dans cnx_create() " + e1);
    			correct = false;
    		}
    		try {
    			connexion = DriverManager.getConnection(Gestion_propriétés.getConnexion_oracle());
    		} catch (SQLException ex) {
    			launcher.append(launcher.format_log.format(new Date())+" Gestion_oracle : ERREUR dans cnx_create " + ex);
    			correct = false;
    		}
     
     
    		return correct;
    	}
    merci

  6. #6
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 709
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 709
    Points : 4 790
    Points
    4 790
    Par défaut
    Lors d'une connexion JDBC, il est possible de fixer un timeout.
    Par contre, comme ta connexion est encapsulée dans Gestion_propriétés.getConnexion_oracle() il faudra le placer à cet endroit
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  7. #7
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Points : 213
    Points
    213
    Par défaut
    merci, ça marche avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DriverManager.setLoginTimeout(15);
    connexion = DriverManager.getConnection(Gestion_propriétés.getConnexion_oracle());
    olivier

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/05/2010, 15h02
  2. Forcer la fermeture d'une application
    Par Bissada dans le forum Langage
    Réponses: 2
    Dernier message: 06/10/2005, 21h42
  3. fermeture d'une application après un temp d'inactivité?
    Par sitdown dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 24/08/2005, 15h44
  4. Détection de la fermeture d'une application
    Par vanitom dans le forum MFC
    Réponses: 6
    Dernier message: 19/08/2005, 18h11
  5. [Event]Annuler la fermeture d'une application
    Par willowII dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 16/11/2004, 09h28

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