Auteur: Yves Martin Date: À: guilde Sujet: Re: JAVA : Une seule instance d'un programme
On Tue, 2013-07-16 at 09:30 +0200, Hugues Levasseur wrote: > Salut la Guilde,
>
> Est-il possible, en java d'interdire à un programme d’être exécuté deux fois
> simultanément ?
> Je parle d'un solution "purement JAVA" et non d'une solution "externe" genre un
> fichier temporaire dont on teste l’existence.
Bonjour,
Voici une solution comme une autre, que l'on rencontre assez souvent, je
pense à Firefox pour ne citer qu'un exemple: l'ouverture d'une socket de
communication sur un port prédéfini, éventuellement avec un "mini
protocole" pour faire quelques actions intelligentes.
Donc déjà ça n'a rien de spécifique à Java et en plus c'est portable que
l'on peut ouvrir une socket réseau en loopback, disons au moins Linux,
Windows et MacOS X
La méthode: l'application suit la logique suivante:
- tenter de se mettre en écoute sur le port Z
- si l'opération réussit, tout va bien, elle bosse et elle tient le port
"le verrou" en quelque sorte
- si l'opération échoue, elle tente d'envoyer un message du genre
"ouvrir le fichier X passé en options de ligne de commande"
vers le port Z déjà ouvert
Soit le message part (pour être traîté par l'instance qui tient le port
Z) et dans ce cas elle peut s'arrêter sans erreur
Soit l'envoi échoue et on peut tenter une seconde fois avant de sortir
finalement avec une erreur
C'est assez "simple", au traitement des erreurs et conditions limites
près, et efficace.
La socket serveur sur le port "Z" sert finalement de verrou, car un seul
processus peut obtenir la ressource.
Le protocole proposé qui consiste à transmettre l'action voulue au
processus maître est par exemple ce qu'utilise Firefox mais c'est
optionnel, c'est juste sympa pour l'expérience utilisateur.