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 :

[Conception] Deux instances de l'application


Sujet :

Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2003
    Messages : 28
    Points : 19
    Points
    19
    Par défaut [Conception] Deux instances de l'application
    Bonjour à tous, j'ai une petite question :

    Comment empêcher un utilisateur de lancer deux fois mon application ?

    je dois éviter que deux instance de mon appli tourne en même temps sur la même machine (des histoires de ports, d'adresse ip, etc...)


    Merci à tous

  2. #2
    Membre du Club

    Profil pro
    Inscrit en
    Février 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    Tu peut empecher une classe d'être instancier 2 fois en mettant un champ static (variable de classe) et en testant cette variable dans ton constructeur... Ou un truc dans le style...

    Bonne continuation

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2003
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    Merci pour ta réponse

    ouais, je suis au courrant (design pattern Singleton).

    Mais dans mon cas, il s'agit de deux machine virtuelle (puisque deux lancements d'appli). Hors, les variables statiques ont une visibilité limité à une instance de la machine virtuelle.

    Oui ?

    Non ?

  4. #4
    Membre du Club

    Profil pro
    Inscrit en
    Février 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    Oui, il me semble que c'est limité a ta VM.

    Pourquoi ne pas utilisé un fichier commun ? Bon, c'est pas des plus propres/pro mais bon, fo bien que ca marche non ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2003
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    ouais, tout à fait, faut qure ca marche.

    Le problème, c que si un plantage survient, ou quoi que ce soit, il faudra que être sûr que ce fichier est bien supprimé (ou modifié, tout dépend de la gestion de ce fichier -> ca peut être une sorte de fichier pid). Donc, cela peut entrainer des problèmes.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 27
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Google.be
    c'est pas des plus propres/pro mais bon
    rien de choquant pour moi
    pas mal d appli le font

  7. #7
    Membre du Club

    Profil pro
    Inscrit en
    Février 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    J'avais pas pensé que c'est la même utilité (ou preske) qu'un fichier pid

    Dans ce cas, ca peut quand même faire pro

    Je trouve juste dommage de devoir passé par un fichier sans pouvoir le faire grace a Java ou a l'OO... Mais bon, si pas le choix, pas le choix comme on dit chez nous

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2003
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    rien de choquant pour moi non plus mais j'ai du mal à concevoir comment utiliser ce fichier.

    Lors du démarrage de l'appli, je crée un fichier.
    A la fermeture je supprime ce fichier.

    Mais, si un problème survient pendant l'appli ?

  9. #9
    Membre du Club

    Profil pro
    Inscrit en
    Février 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    La c'est a toi de bien tout géré

    Je te conseil tout plein de bloc try ... catch Comme ca, en cas de stress tu supprimes ton ti fichier. Mais il faut vraiment géré tout le problème, même le cas du 'tuage' du process

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2003
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    ouais, justement, dans le cas d'un tuage le process (kill -9 ou sous windows, fermeture par le gestionnaire de tâche), comment j'intercepte le signal ? je crois savoir qu'il existe les shutdownHook si je ne m'abuse. Ce système gère-t-il les deux cas ?

  11. #11
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Ce probleme a deja ete evoque plusieurs fois sur ce forum (cette semaine par exemple )

    Une solution simple est resistant au crash (quel qu'ils soient)

    Au tout debut du main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    try
    {
      ServerSocket server = new ServerSocket(12345);
    }
    catch(Exception e)
    {
      // Une autre appli tourne on se barre
      System.exit(1);
    }
    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2003
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    magifique cette solution.

    Elle me parait à priori tout de même proche de la bidouille. Utilisé un port juste pour dire que nous somme là .

    Mais bon, c'est une très bonne piste pour la suite. Je vais creuser cette voie.

    Merci beaucoup à tous

  13. #13
    Membre habitué Avatar de Piolet
    Inscrit en
    Février 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 469
    Points : 160
    Points
    160
    Par défaut
    si tu trouves la solution a ce pb :
    Trouvés un port non utilisé au 1er lancement de ton appli, pour ensuite appelé toujours ce meme port, la est le pb de cette solution.

    fais nous signe
    Hum hum hum...géant vert ! ! !
    Le meilleur moyen de trouver c encore de chercher ! ! !

  14. #14
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Meme si je preferre alloue statiquement un port que je sais ne pas etre utilise, ce que tu veux faire n'est pas vraiment un probleme...

    Au demarrage de l'appli tu cherches un fichier de propriete, si ce fichier n'existe pas (1er lancement) tu fais une boucle qui incremente un numero de port (commence a 5000 pour eviter les well known ) et qui boucle tant que tu as une exception...

    Si tu arrives a lancer un ServerSocket avec un des ports, tu crees le fichier de conf et tu colles dedans le numero de port..

    Probleme: deux applis peuvent se croiser lors du premier lamcement mais c'est un risque a courir..

    Probleme 2: peut etre qu'une appli qui ne tournait pas ce jour la, tournera ensuite et necessitera ce numero de port particulier

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2003
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    exact.

    C'est surtout au niveau de la synchro que ca merde.

    par contre, en faisant new ServerSocket (0), ca crée un socket automatiquement sur un port libre. Après, tu peux récupérer le port effectif en faisant getLocalPort

  16. #16
    Membre à l'essai
    Inscrit en
    Septembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 25
    Points : 17
    Points
    17
    Par défaut Re: [Résolu] [Général Java] Deux instances de l'application
    Citation Envoyé par masto
    Bonjour à tous, j'ai une petite question :

    Comment empêcher un utilisateur de lancer deux fois mon application ?

    je dois éviter que deux instance de mon appli tourne en même temps sur la même machine (des histoires de ports, d'adresse ip, etc...)


    Merci à tous
    bonjour,

    je viens de trouver une autre solution à ce problème. Mais hélas ne fonctionne que sous XP.

    la voici si ça intéresse quelqu'un :
    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
               String command = "TASKLIST /FI \"WINDOWTITLE eq" + jFrame.getTitle() + "\"";
    	        Process child = Runtime.getRuntime().exec(command);
     
    	        // Get the input stream and read from it
    	        InputStream in = child.getInputStream();
    	        int i;
    	        String ch = "";
    	        int nTask = -1; 
     
    	        while ((i = in.read()) != -1) {
    	        	char c = (char)i;
    	        	if(c=='\n'){
    					nTask ++;
    	        	}
    	        	else{
     
    		            ch += c;	
    	        	}
     
    	        }
    	        if(ch.length()>0){
    		       JOptionPane.showMessageDialog(
    					null,
    					"Attention, il y a déjà une session en cours du programme ",
    					"Warning",
    					JOptionPane.WARNING_MESSAGE);
     
     
    					System.exit(0);	
    	        }
    	        else{
    		         //on lance l'appli
    	        }
    Si quelq'un connait bien DOS et peut me donner une solution qui fonctionne sous win9x.

    Cordialement

  17. #17
    Membre actif

    Inscrit en
    Mai 2002
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2002
    Messages : 328
    Points : 209
    Points
    209
    Par défaut
    Si ça peut t'aider dans ton cas très précis, t'en mieux ! Mais pour moi c'est une horreur que d'écrire ce genre de chose en Java !

    Je préfère de loin la solution utilisant un Socket !

    Toine

  18. #18
    Membre à l'essai
    Inscrit en
    Septembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par onlytoine
    Si ça peut t'aider dans ton cas très précis, t'en mieux ! Mais pour moi c'est une horreur que d'écrire ce genre de chose en Java !

    Je préfère de loin la solution utilisant un Socket !

    Toine
    J'ai déjà essayer de faire fonctionner la solution avec les socket mais elle ne fonctionnait pas. je viens de reéssayer. Maintenant ça marche. En fait quand j'ai testé cette solution. J'étais dans mon environnement websphere. et là, j'ai exporté mon jar pour le tester. Et là nickel.

    MERCI. faut taper plus fort dès fois, pour que ça rentre dans ma petite tête. lol

  19. #19
    Membre actif

    Inscrit en
    Mai 2002
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2002
    Messages : 328
    Points : 209
    Points
    209
    Par défaut

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

Discussions similaires

  1. [WD17] Deux instance de l'application
    Par vegetacherif dans le forum WinDev
    Réponses: 5
    Dernier message: 05/05/2013, 18h27
  2. Réponses: 22
    Dernier message: 26/09/2011, 16h14
  3. Drag and Drop entre deux instances d'une même application
    Par befalimpertinent dans le forum C++
    Réponses: 1
    Dernier message: 23/11/2010, 14h33
  4. Réponses: 16
    Dernier message: 16/07/2007, 08h52
  5. Réponses: 11
    Dernier message: 30/06/2007, 04h34

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