Parfois, je vois de nombreuses applications telles que msn, Windows Media Player, etc. qui sont des applications à instance unique (lorsque l'utilisateur s'exécute pendant que l'application exécute une nouvelle instance d'application ne sera pas créée).
En C #, j'utilise la Mutex
classe pour cela mais je ne sais pas comment faire cela en Java.
java
single-instance
Fuang avec S.
la source
la source
Réponses:
Si je crois cet article , par:
Remarque: Ahe mentionne dans le commentaire que l'utilisation
InetAddress.getLocalHost()
peut être délicate:getLocalHost
: retour de l'adresse IP de la machine, vs résultats réels: retour127.0.0.1
.Ou vous pouvez utiliser un
ManagementFactory
objet. Comme expliqué ici :JNLP offre également un
SingleInstanceListener
la source
InetAddress.getLocalHost()
cela ne fonctionne pas comme prévu dans l'environnement DHCP car l'adresse renvoyée dépend de l'accès réseau de l'ordinateur. La solution était d'ouvrir la connexion avecInetAddress.getByAddress(new byte[] {127, 0, 0, 1});
.InetAddress.getByName(null)
renvoie l'adresse de l'interface de bouclage. Je suppose que c'est mieux que de spécifier manuellement 127.0.0.1 car en théorie cela devrait également fonctionner dans les environnements IPv6 uniquement.J'utilise la méthode suivante dans la méthode principale. C'est la méthode la plus simple, la plus robuste et la moins intrusive que j'ai vue, alors j'ai pensé que je la partagerais.
la source
Si l'application. a une interface graphique, lancez-la avec JWS et utilisez le
SingleInstanceService
.Mettre à jour
Le plug-in Java (requis pour les applets et les applications JWS) a été abandonné par Oracle et supprimé du JDK. Les fabricants de navigateurs l'avaient déjà supprimé de leurs navigateurs.
Cette réponse est donc caduque. Ne le laissant ici que pour avertir les personnes qui consultent de la documentation ancienne.
la source
Oui, c'est une réponse vraiment décente pour l'application d'instance unique eclipse RCP eclipse ci-dessous est mon code
dans application.java
la source
Nous utilisons le verrouillage de fichier pour cela (saisir un verrou exclusif sur un fichier magique dans le répertoire de données de l'application de l'utilisateur), mais nous sommes principalement intéressés à empêcher plusieurs instances de s'exécuter.
Si vous essayez de faire passer la deuxième instance des arguments de ligne de commande, etc ... à la première instance, alors utiliser une connexion socket sur localhost tuera deux oiseaux avec une pierre. Algorithme général:
la source
J'ai trouvé une solution, une explication un peu caricaturale, mais qui fonctionne toujours dans la plupart des cas. Il utilise l'ancien fichier de verrouillage pour créer des trucs, mais dans une vue assez différente:
http://javalandscape.blogspot.com/2008/07/single-instance-from-your-application.html
Je pense que ce sera une aide pour ceux qui ont un paramètre de pare-feu strict.
la source
Vous pouvez utiliser la bibliothèque JUnique. Il prend en charge l'exécution d'une application Java à instance unique et est open source.
http://www.sauronsoftware.it/projects/junique/
Sous le capot, il crée des verrous de fichiers dans le dossier% USER_DATA% /. Junique et crée un socket serveur sur un port aléatoire pour chaque appId unique qui permet d'envoyer / recevoir des messages entre les applications java.
la source
Sous Windows, vous pouvez utiliser launch4j .
la source
Classe ManagementFactory prise en charge dans le détail J2SE 5.0 ou version ultérieure
mais maintenant j'utilise J2SE 1.4 et j'ai trouvé celui-ci http://audiprimadhanty.wordpress.com/2008/06/30/ensuring-one-instance-of-application-running-at-one-time/ mais je n'ai jamais testé. Qu'est-ce que tu en penses?
la source
Vous pouvez essayer d'utiliser l'API Preferences. Il est indépendant de la plateforme.
la source
Une manière plus générique de limiter le nombre d'instances sur une seule machine, voire sur un réseau entier, consiste à utiliser un socket multicast.
L'utilisation d'un socket de multidiffusion vous permet de diffuser un message vers n'importe quel nombre d'instances de votre application, dont certaines peuvent se trouver sur des machines physiquement distantes sur un réseau d'entreprise.
De cette façon, vous pouvez activer de nombreux types de configurations, pour contrôler des éléments tels que
Le support multicast de Java se fait via le package java.net avec MulticastSocket et DatagramSocket étant les principaux outils.
Remarque : MulticastSocket ne garantit pas la livraison des paquets de données, vous devez donc utiliser un outil construit sur des sockets multicast comme JGroups . JGroups fait la livraison de garantie de toutes les données. Il s'agit d'un seul fichier jar, avec une API très simple.
JGroups existe depuis un certain temps et a des utilisations impressionnantes dans l'industrie, par exemple, il sous-tend le mécanisme de clustering de JBoss pour diffuser des données à toutes les instances d'un cluster.
Utiliser JGroups, limiter le nombre d'instances d'une application (sur une machine ou un réseau, disons: au nombre de licences qu'un client a achetées) est conceptuellement très simple:
la source
Vous pouvez ouvrir un fichier mappé en mémoire et voir si ce fichier est déjà OUVERT. s'il est déjà ouvert, vous pouvez revenir de main.
Une autre façon est d'utiliser des fichiers de verrouillage (pratique standard Unix). Une autre façon est de mettre quelque chose dans le presse-papiers au démarrage de main après avoir vérifié si quelque chose se trouve déjà dans le presse-papiers.
Sinon, vous pouvez ouvrir une socket en mode écoute (ServerSocket). Essayez d'abord de vous connecter à la prise hte; si vous ne pouvez pas vous connecter, ouvrez un serveur de socket. si vous vous connectez, vous savez qu'une autre instance est déjà en cours d'exécution.
Ainsi, à peu près n'importe quelle ressource système peut être utilisée pour savoir qu'une application est en cours d'exécution.
BR, ~ A
la source
J'ai utilisé des sockets pour cela et selon si l'application est côté client ou côté serveur, le comportement est un peu différent:
la source
la source
EDIT : Au lieu d'utiliser cette approche WatchService, un simple thread de minuterie de 1 seconde pourrait être utilisé pour vérifier si le paramètre IndicatorFile.exists (). Supprimez-le, puis placez l'application au premier plan ().
EDIT : Je voudrais savoir pourquoi cela a été déclassé. C'est la meilleure solution que j'ai vue jusqu'à présent. Par exemple, l'approche de socket serveur échoue si une autre application écoute déjà le port.
Téléchargez simplement Microsoft Windows Sysinternals TCPView (ou utilisez netstat), démarrez-le, triez par "État", recherchez le bloc de ligne qui dit "ÉCOUTE", choisissez celui dont l'adresse distante indique le nom de votre ordinateur, mettez ce port dans votre nouveau Socket ()-Solution. Dans ma mise en œuvre, je peux produire un échec à chaque fois. Et c'est logique , car c'est le fondement même de la démarche. Ou qu'est-ce que je ne reçois pas sur la façon de mettre en œuvre cela?
Veuillez m'informer si et comment je me trompe à ce sujet!
Mon opinion - que je vous demande de réfuter si possible - est que les développeurs sont invités à utiliser une approche dans le code de production qui échouera dans au moins 1 cas sur environ 60000. Et si ce point de vue s'avère correct, alors il est impossible qu'une solution présentée qui ne présente pas ce problème soit rejetée et critiquée pour sa quantité de code.
Inconvénients de l'approche socket en comparaison:
J'ai juste eu une bonne idée sur la façon de résoudre le problème de communication Java nouvelle-instance-instance-existante d'une manière qui devrait fonctionner sur tous les systèmes. Alors, j'ai organisé ce cours en environ deux heures. Fonctionne comme un charme: D
Il est basé sur l' approche de verrouillage de fichier de Robert (également sur cette page), que j'ai utilisée depuis. Pour indiquer à l'instance déjà en cours d'exécution qu'une autre instance a essayé de démarrer (mais ne l'a pas fait) ... un fichier est créé et immédiatement supprimé, et la première instance utilise WatchService pour détecter ce changement de contenu de dossier. Je n'arrive pas à croire qu'il s'agisse apparemment d'une nouvelle idée, étant donné la gravité du problème.
Cela peut facilement être changé pour simplement créer et non supprimer le fichier, puis des informations peuvent y être placées que l'instance appropriée peut évaluer, par exemple les arguments de la ligne de commande - et l'instance appropriée peut alors effectuer la suppression. Personnellement, je n'avais besoin que de savoir quand restaurer la fenêtre de mon application et l'envoyer au premier plan.
Exemple d'utilisation:
Voici la classe:
la source
new ServerSocket()
avec un bloc de capture est tout à fait suffisant,La bibliothèque Unique4j peut être utilisée pour exécuter une seule instance d'une application Java et transmettre des messages. Vous pouvez le voir sur https://github.com/prat-man/unique4j . Il prend en charge Java 1.6+.
Il utilise une combinaison de verrous de fichiers et de verrous de port dynamiques pour détecter et communiquer entre les instances dans le but principal de n'autoriser qu'une seule instance à s'exécuter.
Voici un exemple simple de la même chose:
Avis de non-responsabilité: J'ai créé et entretenu la bibliothèque Unique4j.
la source