Empêcher le lancement de plusieurs instances d'une application Java
Je veux éviter à l'utilisateur de l'exécution de mon application java plusieurs fois en parallèle.
Pour éviter cela, j'ai créé un fichier de verrouillage quand suis-ouverture de l'application, et de supprimer le fichier de verrouillage lors de la fermeture de l'application.
Lorsque l'application est en cours d'exécution, vous ne pouvez pas ouvrir un autre exemple de la jarre. Toutefois, si vous tuez l'application via le gestionnaire des tâches, la fenêtre de l'événement de clôture de la demande n'est pas déclenché et le verrouillage de fichier n'est pas supprimé.
Comment puis-je m'assurer que le fichier de verrouillage méthode qui fonctionne (ou d'un autre mécanisme pourrais-je utiliser?
source d'informationauteur Sathish
Vous devez vous connecter pour publier un commentaire.
Discussion similaire est à
http://www.daniweb.com/software-development/java/threads/83331
Lier un ServerSocket. Si elle ne parvient pas à lier alors abandonner le démarrage. Depuis un ServerSocket peut être lié qu'une seule fois, une seule instsances du programme seront en mesure d'exécuter.
Et avant de vous demander, non. Juste parce que vous liez un ServerSocket, ne signifie pas que vous êtes ouvert au trafic réseau. Que n'entre en vigueur une fois que le programme démarre "à l'écoute" sur le port avec accept().
Je vois deux options que vous pouvez essayer:
Vous pourriez écrire l'id de processus du processus qui a créé le fichier de verrouillage dans le fichier.
Lorsque vous rencontrez un existant fichier de verrouillage, vous ne vous contentez pas de cesser de fumer, mais vous vérifier si le processus d'identification est toujours en vie. Si pas, vous pouvez aller de l'avant.
Vous pouvez créer une socket Serveur comme
au début de votre code. Alors si AddressAlreadyInUse exception interceptée dans le bloc principal, vous pouvez afficher le message approprié.
Si l'application. a une interface graphique il peut être lancé à l'aide de Java Web Start. Le JNLP API fournie web start offre le
SingleInstanceService
. Voici mon la démo. de laSingleInstanceService
.Vous pouvez écrire quelque chose comme cela.
Si le fichier existe d'essayer de le supprimer. si elle n'est pas en mesure de le supprimer. On peut dire que l'application est déjà en cours d'exécution.
Maintenant créer à nouveau le même fichier et de rediriger le sysout et syserr.
Cela fonctionne pour moi
Création d'un serveur de socket, les limites d'un port spécifique avec un ServerSocket exemple au démarrage de l'application est une voie droite.
Notez que
ServerSocket.accept()
blocs, il fonctionne dans son propre thread de sens pour ne pas bloquer le principalThread
.Voici un exemple avec une exception levée détectée :
Vous pouvez utiliser un FileLock, cela fonctionne aussi dans des environnements où plusieurs utilisateurs de partager des ports:
Survit également la Collecte des Ordures.
Le verrou est libéré une fois que votre processus se termine, n'a pas d'importance si régulier de sortie ou de crash ou de quoi que ce soit.
Il y a déjà disponible méthodes de java dans le Fichier de classe à atteindre le même. La méthode est deleteOnExit() qui assurent le fichier est automatiquement supprimé lorsque la JVM sorties. Cependant, il ne permet pas de répondre à la contrainte à des licenciements. On devrait utiliser FileLock en cas de cessation forcée.
Pour plus de détails, consultez, https://docs.oracle.com/javase/7/docs/api/java/io/File.html
Donc extrait de code qui pourrait être utilisé dans la méthode main peut être comme :