Si j'en crois cet article, par :
la première instance de tenter d'ouvrir une socket en écoute sur l'interface localhost. Si elle est en mesure d'ouvrir le socket, il est supposé que c'est la première instance de l'application à lancer. Si non, l'hypothèse est qu'une instance de cette application est déjà en cours d'exécution. La nouvelle instance doivent en informer l'instance existante d'un lancement a été tentée, puis sur quitter. L'instance existante prend le relais après la réception de la notification et déclenche un événement à l'auditeur qui gère l'action.
Remarque: Répétez les mentionne dans le commentaire que l'utilisation d' InetAddress.getLocalHost()
peut être délicat:
- il ne fonctionne pas comme prévu dans le DHCP-environnement parce que l'adresse retournée dépend de si l'ordinateur a accès au réseau.
La Solution a été d'ouvrir la connexion avec InetAddress.getByAddress(new byte[] {127, 0, 0, 1})
;
Probablement lié à un bug 4435662.
- J'ai aussi trouvé un bug 4665037 qui les rapports que les résultats Attendus de l'
getLocalHost
: le retour de l'adresse IP de la machine, par rapport aux résultats : rendement 127.0.0.1
.
il est surprenant d'avoir getLocalHost
rendement 127.0.0.1
sur Linux mais pas sous windows.
Ou vous pouvez utiliser ManagementFactory objet. Comme expliqué ici:
Le getMonitoredVMs(int processPid) méthode reçoit en paramètre l'application en cours PID, et attraper le nom de l'application qui est appelé en ligne de commande, par exemple, l'application a été commencé à partir de c:\java\app\test.jar chemin d'accès, puis la valeur de la variable est "c:\java\app\teste.jar". De cette façon, nous allons prendre juste le nom de l'application sur la ligne 17 du code ci-dessous.
Après cela, nous sommes la recherche de JVM pour antoher processus avec le même nom, si nous l'avons trouvé et l'application PID est différent, cela signifie que c'est la deuxième instance de l'application.
JNLP propose également un SingleInstanceListener