Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

UNE SEULE INSTANCE DE PROGRAMME SANS SOCKET


Information sur la source

Catégorie :Systeme Classé sous : unique, instance, programme, seule Niveau : Débutant Date de création : 20/04/2007 Date de mise à jour : 20/04/2007 16:24:51 Vu : 4 115

Note :
Aucune note

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

Dans le cadre d'un projet, je devais mettre en place un système multi-agents sur un réseau très sécurisé. Le problème que je rencontrais est que les utilisateurs avaient tendance à lancer plusieurs fois mon programme, ce qui n'est pas terrible. La plupart des solutions proposés pour éviter cela sont soit pas très élégante, soit ont des failles.

Par socket : nous crééons un serveur sur un port particulier. Problèmes : pas très élégant, et sur un réseau sécurisé, n'est pas adéquate
Par verrouillage de fichier : nous faisons un lock sur un fichier en local du programme. Problèmes : lorsque nous n'avons pas les droits d'écritures, ou lorsque le programme est interrompu violemment

Une troisiéme solution consiste de créer en natif un programme palliant cette solution, sauf que je recherchais une solution multiplateforme, et qui ne me demande pas trop de formation (je suis null en C/C++ .. faudrait que je m'y penche un jour ...)

Et j'ai eu une petite idée : accéder au répertoire temporaire du système (où normalement, nous avons toujours le droit d'accès et d'écriture), créer u fichier qui se détruit à la fin du programme. Ainsi, si le fichier n'est pas créé, alors nous pouvons lancer le programme. Sinon, nous devons le stopper. Par contre, si nous l'arrêtons brutalement, il rsique ne plus amrcher :/

Je vous propose donc ma solution. Elle ne résoud pas tous les problèmes lié à ce sujet mais aide quand même pour un très grand nombre de cas :)
 

Source

  • package perso.device.system;
  • //Import needed packages
  • import java.io.File;
  • import java.io.IOException;
  • import java.security.AccessController;
  • import sun.security.action.GetPropertyAction;
  • /**
  • * <p>Title : UtilitiesSystem</p>
  • * <p>Description : lass device for System</p>
  • * <p>Copyright : Copyright (c) 2007</p>
  • * <p>Society : Perso</p>
  • * @author Indiana_jules
  • * @version 1.0
  • */
  • public class UtilitiesSystem {
  • /**Method detecting if an instance of a program is running
  • * @param name Program's name
  • * @return Return the state
  • * @throws IOException Input/Output error
  • */
  • public static synchronized Boolean isSingletonProgram(String name) throws IOException {
  • Boolean statut = true;
  • GetPropertyAction a = new GetPropertyAction("java.io.tmpdir");
  • String tmpdir = ((String) AccessController.doPrivileged(a));
  • File temporaryFile = new File(tmpdir + "/" + name +".tmp");
  • statut = !temporaryFile.exists();
  • if(statut){
  • temporaryFile.createNewFile();
  • temporaryFile.deleteOnExit();
  • }
  • return statut;
  • }
  • }
package perso.device.system;

//Import needed packages
import java.io.File;
import java.io.IOException;
import java.security.AccessController;

import sun.security.action.GetPropertyAction;

/**
 * <p>Title : UtilitiesSystem</p>
 * <p>Description : lass device for System</p>
 * <p>Copyright : Copyright (c) 2007</p>
 * <p>Society : Perso</p>
 * @author Indiana_jules
 * @version 1.0
 */
public class UtilitiesSystem {
	/**Method detecting if an instance of a program is running
	 * @param name Program's name
	 * @return Return the state
	 * @throws IOException Input/Output error
	 */
	public static synchronized Boolean isSingletonProgram(String name) throws IOException {
		Boolean statut = true;
		GetPropertyAction a = new GetPropertyAction("java.io.tmpdir");
		String tmpdir = ((String) AccessController.doPrivileged(a));
		
		File temporaryFile = new File(tmpdir + "/" + name +".tmp");
		statut = !temporaryFile.exists();
		
		if(statut){
			temporaryFile.createNewFile();
			temporaryFile.deleteOnExit();
		}
		
		return statut;
	}
}

Historique

20 avril 2007 16:24:51 :
Petite modification dans le texte d'explication

Commentaires et avis

signaler à un administrateur
Commentaire de Twinuts le 20/04/2007 17:00:15 administrateur CS

Salut,

sympa comme bout de code :P (bien qu'il a plus sa place sur codyx...tu veux bien le mettre dessus stp ?), sinon comme déjà évoqué sur une source du même genre il existe aussi les locks sur un fichier en passant par la méthode getChannel().tryLock() de l'objet RandomAccessFile

signaler à un administrateur
Commentaire de indiana_jules le 20/04/2007 17:06:33

Oki je m'en occupe :)

signaler à un administrateur
Commentaire de Ombitious_Developper le 20/04/2007 17:27:30

Salut:

Je pense que cette solution présente beaucoup de lacunes.

signaler à un administrateur
Commentaire de Twinuts le 20/04/2007 17:55:52 administrateur CS

Salut,

Ombitious_Developper c'est pas le tout de dire ça faudrait penser à développer ton idée ...

signaler à un administrateur
Commentaire de sheorogath le 21/04/2007 13:15:38 administrateur CS

ca change un peu des methode static avec une reference de l'instance ...

sinon si pc reboot alors que l'appli tourne le fichier ne seras pas supprime et donc l'appli de redemarreras ce qui peut etre genant si j'ai compris ce qu'a dit twinuts c'est vrai que cree un fichier temporaire et le verrouiller en ecriture serais pas mal ... en cas de caprice du pc au demarrage si le fichier existe mais qu'il est accessible en ecriture tu pourras demarrer l'appli ou si par hasard il te laisse y ecrire dessus essai de le supprimer...

signaler à un administrateur
Commentaire de Twinuts le 21/04/2007 13:27:06 administrateur CS

Salut,

ouep et tu peux aussi supprimer le fichier dans un shutdownhook que tu ajoute à l'objet Runtime grâce à la méthode   addShutdownHook de ce dernier (histoire d'être plus propre....

signaler à un administrateur
Commentaire de sheorogath le 21/04/2007 13:28:53 administrateur CS

lol je parlais d'un reboot sauvage comme le font parfois certains pc ...
ou alors si tu kill le processus ...

signaler à un administrateur
Commentaire de Twinuts le 21/04/2007 13:35:25 administrateur CS

Salut,

idem le seul kill que tu ne peux trapper c'est le kill -9 deunix le reste tu peux...

signaler à un administrateur
Commentaire de sheorogath le 21/04/2007 13:38:11 administrateur CS

jl'avais oublié celui la mais bon je trouve ca un peu hasardeux

signaler à un administrateur
Commentaire de Twinuts le 21/04/2007 13:42:39 administrateur CS

Salut,

pourquoi hasardeux ?

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Unique instance de programme [ par indiana_jules ] Salut, j'aimerais pouvoir n'avoir qu'une seule instance de mon programme qui tourne. Existe-t-il un moyen propre de le faire ? (sans passer par un Ser Exemple de programme, un amateur bloqué [ par dimension9 ] bonjourje d&#233;bute en java et la je tombe sur un &#233;nonc&#233; d'un petit programme, j ai essay&#233; de le faire mais je bloque.c'est en r&#233 Compiler et executer un programme à l'interieur d'un programme java [ par auvrayju ] Bonjour,Je travaille actuellement sur un projet. Dans celui ci je modifie et cr&#233;e des fichier . java (Filewriter). J'aurais besoin de compiler et applet dans frame [ par mastermario ] bonjours a tous. J'ai un petit probleme que je pense etre tout bete : je viens de creer une fonction applets qui se rafraichit toutes les secondes e Probleme d'acquisition de la temperature provenant d'une carte TINI (serveur web embarqué)! [ par mastermario ] Salut a vous!! Voila je n'arrive pas a acqu&#233;rir la temperature provenant de ma carte TINI, j'ai d&#233;ja un programme complet (en applet )qui m Transformer un programme java en applet [ par sylsau ] Bonjour, J'ai fait une petit programme JAVA utilisant SWING. Voici un screenshot de ce petit programme : http://www.webmaitrise.com/utilitaire.png Récupération d'une partie d'une table [ par stefpoisson ] Bonjour,J'ai r&#233;alis&#233; un programme java qui interroge une base de donn&#233;es et avec les r&#233;sultats cr&#233;e un fichier texte. Ce prog help [ par enit128 ] bonjour &#224; tous,j'ai r&#233;alis&#233; un petit programme en java dont l'objectif est le tracage d'une courbe pr&#233;sentant des&nbsp; valeurs de integration code C dans un programme java [ par prog_amateur ] salut je recherche une methode permettant d'integrer un code C dans un programme java Pb de récupération d'évenement ! [ par joduak ] Bonjour, Comme le sujet l'indique j'ai un &#233;norme probl&#232;me d'&#233;coute clavier...:p En fait j'ai construit une classe "EcouteClavier" qui


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version


LG KP501

Entre 9€ et 159€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,624 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.