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

Entrée/Sortie Java Discussion :

Instance unique d'un programme (sans sockets ni fichier temporaire)


Sujet :

Entrée/Sortie Java

  1. #1
    Membre averti Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 431
    Points : 305
    Points
    305
    Par défaut Instance unique d'un programme (sans sockets ni fichier temporaire)
    Salut à tous et à toutes

    voici mon idée : une classe <InstanceUnique> tente de renommer un jar <Application.jar> et SI elle réussit ALORS elle restaure l'ancien nom et lance l'application, SINON on sait que l'application est déjà lancée donc on affiche un message..

    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
    /*
     *  Classe:     InstanceUnique
     *  Auteur:     Chatbour
     */
     
    import java.io.IOException;
    import java.awt.Desktop;
    import javax.swing.JOptionPane;
     
    public class InstanceUnique {
        // nom du fichier jar
        private String nomJar = "application.jar";
        // nom temporaire
        private String nomTmp = "app_tmp.jar";
     
        public InstanceUnique() {
            try {
                File leJar = new File(nomJar);
                if(leJar.renameTo(new File(nomTmp)) == true) {
                    // On est le premier à instancier l'application
                    new File(nomTmp).renameTo(new File(nomJar));
                    Desktop.getDesktop().open(leJar);
                }
                else {
                    // Sinon afficher un message
                    JOptionPane.showMessageDialog(null, "L'application est déjà lancée !");
                }
            }
            catch(IOException e) {
                System.exit(-1);
            }
        }
     
        public static void main(String[] args) {
            new InstanceUnique();
        }
    }

    Dans le zip joint il y a une petite démonstration..

    Qu'est-ce que vous en dites ?
    Fichiers attachés Fichiers attachés

  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
    magnifique Faudra que tu précise juste

    1) qu'est-ce qui te fais croire que l'impossibilité de renommer implique nécessairement que l'applicaition est lancée? (Le fichier peut être read-only par exemple ou pas de droit d'accès)
    2) qu'est-ce qui te fait croire que, quand l'application sera lancée, le renommage est impossible?

    Les fichiers de lock dans le répertoire temporaire, çà reste le plus efficace.

  3. #3
    Membre averti Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 431
    Points : 305
    Points
    305
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    magnifique Faudra que tu précise juste

    1) qu'est-ce qui te fais croire que l'impossibilité de renommer implique nécessairement que l'applicaition est lancée? (Le fichier peut être read-only par exemple ou pas de droit d'accès)
    2) qu'est-ce qui te fait croire que, quand l'application sera lancée, le renommage est impossible?

    Les fichiers de lock dans le répertoire temporaire, çà reste le plus efficace.
    1. Franchement je n'ai pas pensé à ça
    2. A ce que je connais ce n'est pas possible.. Non ?

    Je précise que c'est une solution "débutant" qui fonctionne lorsque l'exécutable de l'application n'est pas read-only

    Enfin, merci bien pour ton commentaire constructif

  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
    Citation Envoyé par Chatbour Voir le message
    2. A ce que je connais ce n'est pas possible.. Non ?
    Sous windows, non, mais java est multi plateforme. De plus comme ce comportement sous windows (auto locking des fichiers ouverts) fait plus chier qu'autre chose, rien ne garantit que ce ne sera pas fixé

  5. #5
    Membre averti Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 431
    Points : 305
    Points
    305
    Par défaut
    OK, merci pour l'explication
    un point de moins pour mon idée

  6. #6
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    +1 pour tchize_

    Sans compter qu'un fichier temporaire peut être marqué "delete on exit" et qu'une socket est automatiquement fermé à la fin du process.

    Alors que dans ton cas si le fichier n'est pas renommé correctement à la fin du programme tout est bloqué

    De plus un utilisateur peut avoir le droits d'exécuter un programme mais pas de le renommer !


    a++

  7. #7
    Membre averti Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 431
    Points : 305
    Points
    305
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    +1 pour tchize_

    Sans compter qu'un fichier temporaire peut être marqué "delete on exit" et qu'une socket est automatiquement fermé à la fin du process.

    Alors que dans ton cas si le fichier n'est pas renommé correctement à la fin du programme tout est bloqué

    De plus un utilisateur peut avoir le droits d'exécuter un programme mais pas de le renommer !


    a++
    Merci pour le commentaire adiGuba

    je trouve comme même que cette solution (dans le cas où les droits de renommer est fourni) est "meilleure" que celle avec les fichiers temporaires : le risque de ne pas renommer le fichier dans ma solution est beaucoup plus inférieure que le risque de ne pas supprimer le fichier temporaire, vous trouvez pas ?

  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
    Normalement, quand on utilise un fichier temporaire, on le lock, on se contente pas de voir si il existe. Si l'application qui l'a créé est arrêté mais a oublié de le nettoyer, y a plus de lock dessus. Par contre, si elle l'a locké et qu'il l'est toujours, c'est que l'application tourne encore!

    Pour faire des lock en java, il faut passer par l'api des FileChannel et utilise tryLock()

  9. #9
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Chatbour Voir le message
    je trouve comme même que cette solution (dans le cas où les droits de renommer est fourni) est "meilleure" que celle avec les fichiers temporaires : le risque de ne pas renommer le fichier dans ma solution est beaucoup plus inférieure que le risque de ne pas supprimer le fichier temporaire, vous trouvez pas ?
    Qu'est-ce qui me prouve que le fichier sera bel et bien renommé à la fin ?


    Tandis qu'avec un fichier temporaire il suffit d'utiliser un deleteOnExit() pour qu'il soit supprimé automatiquement à la fin du programme, même en cas d'exception. En fait je ne vois que 2 cas particulier (à ma connaissance) où cela ne fonctionnerait pas :
    • Sous Windows si le fichier est utilisé par un autre processus (fichu système de fichier )
    • Si la JVM se plante méchamment (pas un exception mais bel et bien un plantage)



    Maintenant si tu veux un système plus évolué tu peux peut-être te tourner vers les FileLock, mais attention car le fonctionnement est également dépendant du système...


    a++

  10. #10
    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
    depuis la doc de deleteonexit:
    Note: this method should not be used for file-locking, as the resulting protocol cannot be made to work reliably. The FileLock facility should be used instead.

  11. #11
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Le filelocking consiste à interdire l'accès à un fichier aux autres processus... on ne fait pas du filelocking ici !

    a++

  12. #12
    Membre averti Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 431
    Points : 305
    Points
    305
    Par défaut
    OK merci bien les gars

    je vais essayer ce que vous avez dis : dommage que ma solution ne soit pas fonctionnelle mais je suis heureux que ça soit une occasion pour moi pour apprendre de nouvelles choses

    Merci encore pour vos commentaires constructifs..

Discussions similaires

  1. Instance unique d'application en java: fermeture des sockets
    Par Bundy*Al dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 27/03/2014, 09h12
  2. [Débuter] Instance unique et sockets
    Par clairetj dans le forum Réseau
    Réponses: 2
    Dernier message: 09/10/2013, 08h21
  3. Instance Unique de programme, les exemples ne marchent pas
    Par novatronics dans le forum Général Java
    Réponses: 6
    Dernier message: 30/03/2009, 15h33
  4. [VB6] [DLL] DLL à instance unique
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 19/09/2003, 08h07
  5. Gestion d'un programme sans Souris ! ???
    Par altahir007 dans le forum Composants VCL
    Réponses: 7
    Dernier message: 03/04/2003, 11h30

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