Une seule instance de programme sans socket

Contenu du snippet

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 / Exemple :


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; } }

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.