Je développe actuellement une application Java pour effectuer des calculs. Mon application va être distribuée sous forme de fichier jar et pour chaque calcul, je vais utiliser un script qui lance mon pot. Mon problème est le suivant: J'ai créé une classe singleton pour effectuer des interrogations de bases de données mais je ne sais pas comment réparer mon singleton dans la JVM entre deux exécutions de jar. J'ai essayé de lancer une classe vide en stockant le singleton et en attendant infiniment mais quand j'exécute mon programme jar le singleton n'est pas récupéré mais instancié ... Mon code est le suivant:Comment réparer un singleton dans une JVM?
Le programme principal pour garder le singleton dans la machine virtuelle Java:
/**
* Entry point for the singleton generation
* @author yann.blanc
*
*/
public class MainSingleton {
/**
* Entry point
* @param args Command line arguments, used to define the request type
*/
public static void main (String[] args) {
try {
/*Here my singleton is instantiated*/
DatabaseServiceSingleton service = DatabaseServiceSingleton.getInstance();
while (true)
{
Thread.sleep(1000);
}
} catch (ServiceException e) {
e.printStackTrace();
System.exit(0);
} catch (InterruptedException e) {
e.printStackTrace();
System.exit(0);
}
}
}
Mon singleton:
public final class DatabaseServiceSingleton implements IDatabaseService {
private static DatabaseServiceSingleton instance = null;
/*PARAM and FUNCTIONS OMIT FOR A BETTER READABILITY*/
/*Constructor with exception to ensure that clients are stopped if the singleton can't be instantiated*/
private DatabaseServiceSingleton() throws ServiceException {
try {
/*Get the current path*/
String urlCourante = getClass().getProtectionDomain().getCodeSource().getLocation().getFile();
String[] tab;
if(urlCourante.contains("\\")){
tab = urlCourante.split("\\");
} else {
tab = urlCourante.split("/");
}
for(int i = 0; i < tab.length -1; i++) {
pathFolder += tab[i];
}
/*Get configuration informations*/
getConfiguration();
/*Init database connectors*/
initBaseConnexion();
System.out.println(this.getClass().getClassLoader().toString());
} catch (Exception e) {
throw new ServiceException("Problème d'entrée sortie lors de la lecture du fichier "
+ "de configuration. Le service n'a pas pu être instancié : "+e.getMessage());
}
}
/*Method for retrieve the singleton instance*/
public static synchronized DatabaseServiceSingleton getInstance() throws ServiceException {
if (instance == null) {
instance = new DatabaseServiceSingleton();
}
return instance;
}
}
j'étais certain que cela fonctionnerait ... pouvez-vous me expliquer pourquoi ce n'est pas? Merci pour l'aide :)
EDIT: J'ai vérifié le chargeur de classe et il est toujours le même (pour l'application de pot et le MainSingleton)
Le Singleton est unique dans la JVM. Mais 2 jars exécutions = 2 JVM. Quel est votre besoin exactement? –
"Lorsque j'exécute mon programme jar, le singleton n'est pas récupéré mais instancié" - Pouvez-vous clarifier ce que vous voulez dire? La question n'est pas claire pour moi. – Swapnil
@ArnaudDenoyelle J'ai besoin de créer un pseudo service toujours en cours d'exécution dans la JVM et auquel mes programmes jar peuvent accéder. J'utilisais RMI auparavant mais mes programmes fonctionnaient localement donc j'ai essayé la solution singleton ... – Ko2r