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 :

verrouillage de fichier et lecture


Sujet :

Langage Java

  1. #1
    Invité
    Invité(e)
    Par défaut verrouillage de fichier et lecture
    Bonjour,

    J'essaye de concevoir un système qui limiterai le nombre d'instance de mon programme qu'il est possible de lancer en même temps (1 seule).

    Pour cela, j'utilise le verrouillage de fichier RandomAccessFile.getChannel().tryLock().
    Si le programme arrive à verrouiller le fichier (1ere instance), il écrit dedans des informations.
    Si il n'arrive pas à verrouiller le fichier (instance secondaire), il lit les informations déjà écrite.

    Le problème, c'est que dans le cas d'une instance secondaire, le programme n'arrive pas à lire le contenu du fichier, car celui ci est verrouillé.
    Et je ne peux pas déverrouiller le fichier depuis la 1ere instance, car sinon l'instance secondaire arriverait à le verrouiller (et ça perd tout l'intérêt).

    Je voudrais donc pouvoir verrouiller le fichier (en écriture), mais qu'il reste accessible en lecture.

    Des idées ?

    Merci

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Plus efficace : ouvre un socket client vers un port X. Si tu ne parviens pas à l'ouvrir, ouvre ce port en serveur (pour que les instances futures puissent l'écouter). Si tu parviens à l'ouvrir, c'est que tu as affaire à une instance de ton programme qui existe déjà.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 347

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par dingoth Voir le message
    Plus efficace : ouvre un socket client vers un port X. Si tu ne parviens pas à l'ouvrir, ouvre ce port en serveur (pour que les instances futures puissent l'écouter). Si tu parviens à l'ouvrir, c'est que tu as affaire à une instance de ton programme qui existe déjà.
    la logique voudrait qu'on ouvre d'abord un port XXX en serveur, et si on y arrive pas, on se connecte dessus en client.

    Le problème, c'est que le port XXXX est défini de manière fixe. Et il y a une possibilité (minime) que ce port soit dejà occupé par un autre programme. Donc ça casse tout.

    @laclac : rien trouvé à cet endroit là

  5. #5
    Invité
    Invité(e)
    Par défaut
    l'algo de mon programme

    - ouverture et création d'un fichier (avec RandomAccessFile)
    - tentative de verrouillage du fichier, avec le FileChannel et tryLock()
    - Si le verrouillage réussi :
    ------ Ouverture d'un port TCP serveur libre (n'importe lequel)
    ------ Ecriture du numéro de port dans le fichier
    ------ Lancement d'un Thread qui va ecouter sur le port TCP
    - Si le verrouillage ne réussi pas (si il y a déjà un instance de lancée)
    ------ Lecture du fichier verrouillé et récupération du port précédemment écrit
    ------ Connexion TCP au port indiqué
    ------ Envoie d'information à la première instance via TCP

    Cette méthode est parfaite (je ne pense pas me vanter), mais elle bug au niveau : "Lecture du fichier verrouillé et récupération du port précédemment écrit"
    Dernière modification par Invité ; 10/10/2009 à 01h06.

  6. #6
    Membre très actif
    Inscrit en
    Mars 2008
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 283
    Par défaut
    Créez un fichier temporaire sans oublier d'appeler "File#deleteOnExit()"
    Les chances de collision sont très minimes je pense.

    N'oubliez (si vous utilisez SWING) de ne pas utiliser JFrame#EXIT_ON_CLOSE comme action de fermeture mais vérifiez avant la fermeture des sockets. Ce serait bête de perdre la connexion entre vos instances.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Et j'en fais quoi de ce fichier ?
    Je vois pas très bien :/

  8. #8
    Membre très actif
    Inscrit en
    Mars 2008
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 283
    Par défaut
    C'est simple :

    Au lancement...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Si "./temp.tmp" existe alors
       Lire le fichier
       Récupérer le port de l'instance principale
       Fermer le fichier (Stream)
    Sinon
       Créer le fichier, ne pas oublier de demander à la JVM de le supprimer une fois fini.
       Créer un ServerSocket
       Ecrire le numero de port du ServerSocket dans le fichier
       Fermer le fichier (Stream)
    Fin
    Il ne faut pas oublier de fermer vos flux (Input/OutputStream) pour éviter certains problèmes ennuyeux d'accès concurrents.
    Il faut aussi veiller à ce que la première instance survive jusqu'à la fermeture des autres instances, sinon les liens entre instances se perdent.

  9. #9
    Invité
    Invité(e)
    Par défaut
    ok je vois,
    tu me proposes de tester l'existence du fichier,
    alors que moi j'ai choisi le verrouillage de fichier.

    le problème du test de l'existence de fichier, c'est qu'il est possible qu'un programme le supprime, ou le modifie
    et donc il y a potentiellement une faille.

  10. #10
    Membre très actif
    Inscrit en
    Mars 2008
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 283
    Par défaut
    Citation Envoyé par PierreD87 Voir le message
    ok je vois,
    tu me proposes de tester l'existence du fichier,
    alors que moi j'ai choisi le verrouillage de fichier.

    le problème du test de l'existence de fichier, c'est qu'il est possible qu'un programme le supprime, ou le modifie
    et donc il y a potentiellement une faille.
    C'est un problème comme un autre. Entre le port fixe et le fichier à surveiller il faut au final faire un choix.
    Je ne vois aucune autre alternative portable.

  11. #11
    Invité
    Invité(e)
    Par défaut
    ce qu'il me faut, en fait, c'est un moyen de verrouiller un fichier en écriture/suppression, mais qu'il soit toujours accessible en lecture.

    pour le moment, j'utilise le FileChannel.tryLock(), mais il y a surement une autre option

  12. #12
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    L'utilisation de la socket est lourd et compliqué.

    Tu dois découper le problèmes en plusieurs sous-problèmes.
    Donc tu vas utiliser deux fichiers :
    1. Le premier est celui qui est verrouillé, toujours vide. Il permet de contrôler les instances multiples.
    2. Le second contient les informations à dispositions des autres instances. Il est toujours lisible par tous le monde.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  13. #13
    Invité
    Invité(e)
    Par défaut
    ok, je vois

    Le fichier de verrouillage sert juste à indiquer qu'il y a une instance en cours.
    Le deuxième fichier pourrait permettre de transmettre les informations de la seconde instance à la première instance. (il n'est pas verrouillé).

    Dans ce cas, existe t-il un mécanisme pour dire à la première instance de surveiller les modifications sur le deuxième fichier ? (mis à part la surveillance répétée)

    Merci

  14. #14
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par PierreD87 Voir le message
    Dans ce cas, existe t-il un mécanisme pour dire à la première instance de surveiller les modifications sur le deuxième fichier ? (mis à part la surveillance répétée)
    Tu changes complètement la problématique de départ.
    Tu voulais empêcher une autre instance de se lancer, en lui transmettant une info.
    Maintenant tu acceptes plusieurs instances de ton programme.
    Explique clairement ce que tu souhaites obtenir car la solution technique sera différente selon les cas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Je veux que si on tente de lancer une deuxième fois mon programme :
    - Il y ai un mécanisme pour détecter qu'il y a déjà une instance de lancée
    - Que les paramètres du deuxième lancement soient transmit à la première instance de mon programme
    - Que la deuxième tentative de lancement avorte, d'une manière ou d'une autre

    Imaginons le cas d'un visualisateur de document avec onglet.
    Il est possible d'ouvrir plusieurs documents au sein du même programme.
    La ligne de lancement ressemble à : "monProgramme monFichier"
    Si il y a déjà une instance de mon programme en cours, je voudrais que le nom de monFichier soit transmit à la premiere instance (puis que la deuxieme se ferme)

    Quand je dis que la deuxième instance doit se fermer, ça signifie que sont lancement est interrompu. Un peu comme une exception qui arrete la création d'un objet.

Discussions similaires

  1. [AC-2007] Verrouillage de fichier et lecture seule
    Par Accessifiante dans le forum Runtime
    Réponses: 4
    Dernier message: 23/07/2013, 20h36
  2. [fichier binaire]lecture ecriture dump
    Par parsy dans le forum Langage
    Réponses: 7
    Dernier message: 10/08/2005, 18h40
  3. Réponses: 8
    Dernier message: 09/08/2005, 11h44
  4. Réponses: 7
    Dernier message: 05/08/2005, 16h32
  5. [PDE] Editeur de fichiers en lecture seule
    Par simsky dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 13/07/2005, 12h18

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