Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1327 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Synchronisation de deux programmes dans 2 JVMs

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Synchronisation de deux programmes dans 2 JVMs

n°599744
machinbidu​le1974
Do you feel lucky, punk ?
Posté le 31-12-2003 à 11:33:32  profilanswer
 

Salut,
 
J'ai un souci sur mon projet: je dois empêcher que deux instances d'un programme s'exécutent en parallèle à cause d'un problème de collision sur une ressource partagée. Autre contrainte: les 2 instances du programme s'exécutent dans 2 JVMs distinctes (sinon ce serait trop facile)... Comment puis-je m'assurer lorsque mon programme se lance qu'une autre instance n'est pas déjà démarrée ???
 
J'avais pensé à créer au lancement de mon prog un fichier sur le disque qui servirait de "flag" afin de passer l'information entre les JVMs. Si le fichier existe, une instance est en mémoire sinon je peux exécuter mon prog... Mon souci c'est qu'il est facile de créer le fichier au lancement de l'instance de mon programme mais que je dois m'assurer que dans tous les cas quand celui-ci se termine le fichier "flag" est bien supprimé... Dois-je utiliser pour cela un "Shutdown hook" ???
 
Est-ce-que vous voyez une meilleure solution ?
 
Merci

mood
Publicité
Posté le 31-12-2003 à 11:33:32  profilanswer
 

n°599746
darklord
You're welcome
Posté le 31-12-2003 à 11:36:49  profilanswer
 

problème intéressant. Est ce que ton programme utilise une resource réseau quelconque (genre ouvre un serversocket sur un port bien donné?).
 
Pour le fichier ce n'est pas spécialement mauvais, même si c'est pas top (je connais des produits open source qui utilisent ce mécanisme).
 
Pour le shutdown hook tu pourrais eventuellement utiliser ce concept mais à mon avis theFile.deleteOnExit() devrait etre plus propre.

n°599749
nraynaud
lol
Posté le 31-12-2003 à 11:41:57  profilanswer
 

+1 pour le fichier, dans /var/lock en faisant gaffe, que ça peut quand même être un système de fichier réseau (bien que ce soit peu probable).
 
et +1 pour le deleteOnExit().


---------------
trainoo.com, c'est fini
n°599750
machinbidu​le1974
Do you feel lucky, punk ?
Posté le 31-12-2003 à 11:43:32  profilanswer
 

darklord a écrit :

problème intéressant. Est ce que ton programme utilise une resource réseau quelconque (genre ouvre un serversocket sur un port bien donné?).
 
Pour le fichier ce n'est pas spécialement mauvais, même si c'est pas top (je connais des produits open source qui utilisent ce mécanisme).
 
Pour le shutdown hook tu pourrais eventuellement utiliser ce concept mais à mon avis theFile.deleteOnExit() devrait etre plus propre.


 
Oui mon programme utilise un port pour communiquer avec un serveur mais la collision entre les 2 instances n'intervient pas sur cet aspect. Mon programme utilise une API qui crée un fichier dont je ne peux pas modifier le nom car il est codé en dur... Quand mon 1er prog se lance, il sauve dans ce fichier un identifiant de session sur 4 positions alphanumériques. Quand le second se lance, il écrit son id de session dans le même fichier, faisant ainsi planter la 1ère instance...
 
Utiliser un fichier comme "flag externe" me paraît pas mal mais je suis pas sûr que ça soit sûr dans les cas tordus de  lancement simultané de 2 instances...
 
Pour le theFile.deleteOnExit(), je connaissais pas, merci  :jap:  Avec ça, je suis sûr que la ressource est nettoyée proprement

n°599752
machinbidu​le1974
Do you feel lucky, punk ?
Posté le 31-12-2003 à 11:46:07  profilanswer
 

nraynaud a écrit :

+1 pour le fichier, dans /var/lock en faisant gaffe, que ça peut quand même être un système de fichier réseau (bien que ce soit peu probable).
 
et +1 pour le deleteOnExit().
 


 
Vos appréciations me rassurent. C'est parti pour le code  :)

n°599758
darklord
You're welcome
Posté le 31-12-2003 à 11:56:50  profilanswer
 

bin pq tu ne regardes pas si le port en question est bindé au tout début. Si c'est le cas tu as une autre instance qui tourne et basta :o

n°599790
benou
Posté le 31-12-2003 à 12:34:11  profilanswer
 

ouais, moi j'aurais utilisé un port plutot qu'un fichier : c'est l'os qui ferme le port à la fermeture du programme ...


---------------
ma vie, mon oeuvre - HomePlayer
n°599796
darklord
You're welcome
Posté le 31-12-2003 à 12:40:12  profilanswer
 

d'un autre coté le bind du port ne se fait pas immédiatement au lancement du prog aussi :/

n°599813
machinbidu​le1974
Do you feel lucky, punk ?
Posté le 31-12-2003 à 13:01:30  profilanswer
 

Bon je suis pas trop calé côté bind de port :/ Tout ce que je sais c'est que mon programme communique avec un serveur sur un port donné mais que je n'ouvre pas de port explicitement. L'API que j'utilise le fait probablement de manière transparente mais si c'est le cas je n'ai jamais observé de collision entre 2 instances de mon client...
 
Je vais m'en tenir à l'utilisation d'un fichier externe comme "lock"


Message édité par machinbidule1974 le 31-12-2003 à 13:01:59
n°599817
benou
Posté le 31-12-2003 à 13:03:45  profilanswer
 

nan mais il aurait fallu que ton client ouvre un port avec un server socket. comme ca au démarage, le client essaye d'ouvrir le port. Si ca marche pas c'est qu'il est déjà utilisé par un autre client ...
 
en faite, ca revient à ouvrir un port pour rien quoi ...


---------------
ma vie, mon oeuvre - HomePlayer
mood
Publicité
Posté le 31-12-2003 à 13:03:45  profilanswer
 

n°599818
machinbidu​le1974
Do you feel lucky, punk ?
Posté le 31-12-2003 à 13:04:18  profilanswer
 

ok, j'avais pas compris. Mais vous me mettez le doute maintenant...  :whistle:  Est-ce-que le port sera libéré dans tous les cas de figure de terminaison du prog comme ça serait le cas en utilisant la méthode "theFile.deleteOnExit()" ???


Message édité par machinbidule1974 le 31-12-2003 à 13:06:01
n°599829
machinbidu​le1974
Do you feel lucky, punk ?
Posté le 31-12-2003 à 13:09:52  profilanswer
 

Bon, je viens de trouver ceci dans la javadoc de la méthode createNewFile() de File:
 
Atomically creates a new, empty file named by this abstract pathname if and only if a file with this name does not yet exist. The check for the existence of the file and the creation of the file if it does not exist are a single operation that is atomic with respect to all other filesystem activities that might affect the file. This method, in combination with the deleteOnExit() method, can therefore serve as the basis for a simple but reliable cooperative file-locking protocol.
 
 :)

n°599847
darklord
You're welcome
Posté le 31-12-2003 à 13:37:00  profilanswer
 

moralité : "lire la javadoc cai bieng [:joce]" :o


Message édité par darklord le 31-12-2003 à 13:37:18

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Synchronisation de deux programmes dans 2 JVMs

 

Sujets relatifs
Bdd et synchronisationFichier .bat qui lance plusieurs programmes...
Lien entre 2 programmes via un tubeIdées de programmes
Interaction entre deux programmesSynchronisation de threads
synchronisation de processusLinux, ports série et pb de synchronisation (pour experts)
[WML] Comment faire pour tester ses programmes WML ?[RESOLU][C] Les interfaces des programmes
Plus de sujets relatifs à : Synchronisation de deux programmes dans 2 JVMs


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR