Comment autoriser l'exécution d'une seule instance d'un programme Java à un moment?
J'ai besoin pour empêcher les utilisateurs de démarrage de mon application Java (WebStart Swing app) plusieurs fois. Ainsi, si l'application est déjà en cours d'exécution, il ne devrait pas être possible de commencer à nouveau ou afficher un message d'avertissement /d'être de nouveau fermé.
Est-il un moyen pratique pour atteindre cette? J'ai pensé sur le blocage d'un port ou d'écrire qqch à un fichier. Mais j'espère que vous pouvez accéder à certaines propriétés du système ou de la JVM?
btw. plate-forme cible est Windows XP avec Java 1.5
- Plus solution la plus simple 🙂 java.nio.verrouillage de fichier voir l'exemple complet stackoverflow.com/a/20015771/185022
Vous devez vous connecter pour publier un commentaire.
Je pense que votre suggestion de l'ouverture d'un port à écouter lorsque vous démarrez votre application est la meilleure idée.
Il est très facile à faire et vous n'avez pas besoin de vous soucier du nettoyage lorsque vous fermez votre application. Par exemple, si vous écrivez à un fichier, mais quelqu'un tue alors le processus à l'aide de Gestionnaire de Tâches le fichier ne sera pas supprimé.
Aussi, si je me souviens bien il n'y a pas de moyen facile d'obtenir le PID d'un processus Java à partir de l'intérieur de la JVM donc, ne pas essayer et de trouver une solution à l'aide de PIDs.
Quelque chose comme cela devrait faire l'affaire:
Cet exemple de code explicitement se lie à
127.0.0.1
qui devrait éviter tout pare-feu mises en garde, que tout le trafic sur cette adresse doit être à partir du système local.Lors de la sélection d'un port d'essayer d'éviter que celle mentionnée dans la liste des Bien Connu Ports. Vous devriez idéalement rendre le port utilisé configurable dans un fichier ou par l'intermédiaire d'un commutateur de ligne de commande dans le cas de conflits.
Que la question des états qui WebStart est utilisé, la solution évidente est d'utiliser
javax.jnlp.SingleInstanceService
.Ce service est disponible dans la version 1.5. Notez que 1.5 est actuellement la majeure partie de la voie par le biais de sa Fin De Vie. Obtenez avec Java SE 6!
Je pense que la meilleure idée serait d'utiliser le verrouillage de fichier (tout à fait une vieille idée 🙂 ). Depuis Java 1.4 une nouvelle bibliothèque d'e/S a été introduit, qui permet le verrouillage de fichier.
Une fois que l'application démarre, il essaie d'acquérir le verrou sur un fichier (ou le créer si il n'existe pas), lorsque l'application se ferme le verrou est publiée. Si l'application ne peut pas acquérir un verrou, il se ferme.
L'exemple, comment le faire de verrouillage de fichier est par exemple dans Développeurs Java Almanach.
Si vous souhaitez utiliser le verrouillage de fichier dans l'application Java Web Start ou une applet, vous devez chanter l'application ou de l'applet.
Nous faisons la même chose en C++ par la création d'un kernel objet mutex et à la recherche d'elle lors de son démarrage. Les avantages sont les mêmes qu'à l'aide d'un socket, c'est à dire lorsque le processus meurt/plantages/sorties/est tué, l'objet mutex est nettoyé par le noyau.
Je ne suis pas un programmeur Java, donc je ne suis pas sûr de savoir si vous pouvez faire le même genre de chose en Java?
Vous pouvez utiliser JUnique de la bibliothèque. Il fournit un support pour l'exécution d'une seule instance de l'application java et est open-source.
http://www.sauronsoftware.it/projects/junique/
Voir aussi ma réponse à Comment mettre en œuvre une seule instance de l'application Java?
J'ai créer la croix-plate-forme AppLock classe.
http://rumatoest.blogspot.com/2015/01/howto-run-only-single-java-application.html
C'est à l'aide du fichier de technique de verrouillage.
Mise à jour. Au 2016-10-14 j'ai créé paquet compatible avec maven/gradle https://github.com/jneat/jneat et expliqué ici http://rumatoest.blogspot.com/2015/06/synchronize-code-over-multiple-jvm.html
Vous pouvez utiliser le registre, bien que cette moitié de défaites le but de l'utilisation d'un langage de haut niveau comme java. Au moins votre plate-forme cible est windows =D
Essayer JUnique:
J'ai vu beaucoup de ces questions, et je cherchais à résoudre le même problème dans une plate-forme indépendante de façon à ne pas prendre le risque d'entrer en collision avec le pare-feu ou obtenir sur la prise de trucs.
Donc, voici ce que j'ai fait:
En Utilisant Le Système.getProperty("java.io.tmpdir") pour le chemin du fichier de verrouillage permet de s'assurer que vous aurez toujours créer votre serrure sur la même place.
Puis, à partir de votre programme, vous appelez simplement quelque chose comme:
Et qui le fait pour moi. Maintenant, si vous tuez le programme, il ne sera pas effacer le fichier de verrouillage, mais vous pouvez résoudre ce problème en écrivant le programme du PID dans le fichier de verrouillage et de faire la méthode lock() vérifier si ce processus est déjà en cours d'exécution. Il reste comme un assingment pour toute personne intéressée. 🙂