Le singleton en environnement clusterisé
Voilà, dans le cadre de mon stage je reprend du code existant tournant sous Jboss 5.
Il y a une classe singleton nommée MultithreadedEngine.java (n'est pas encore multi-threads, malgré son nom).
Elle est initialisée de cette façon:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| private static MultithreadedEngine instance = new MultithreadedEngine();
.....
private MultithreadedEngine()
{
this.dictionary = new InternalDictionary();
this.scheduler = new InternalScheduler(dictionary);
this.acquisitionAndProcessing = new AcquisitionAndProcessingImpl(this.dictionary,this.scheduler);
this.configuration = new ConfigurationImpl(this.dictionary,this.scheduler);
this.loader = new InternalLoader(this.dictionary,this.scheduler);
//this.importExport = new ImportExportImpl(this.dictionary);
}
public static MultithreadedEngine getInstance()
{
return instance;
} |
A ce que j'ai compris le programme contient un peu de multithreading (mais pas cette classe).
Si j'en juge par ce qui est dit dans ce tuto: http://christophej.developpez.com/tu...n/multithread/
la façon dont le singleton MultithreadedEngine est créée est sûr: je ne devrais avoir qu'une seule instance de cette classe, même dans un environnement multi-threads.
Mais .... le problème c'est que j'ai deux instances de cette classe.
En effet j'utilise cette classe dans des EJB. Exemple:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @PostConstruct
public void init()
{
try
{
this.runtimeManager = MultithreadedEngine.getInstance().getConfigurator();
this.scheduler = MultithreadedEngine.getInstance().getScheduler();
LoggerImpl.getInstance().debug(sessionBeanName + " Bean Initialized.");
}
catch (Exception e)
{
LoggerImpl.getInstance().fatal(sessionBeanName + " Error during initilizing the context.");
ThrowableExplorer.print(e);
}
} |
Quand par exemple je lance un test Junit, je fais un loockup sur un ejb: l'instance du singleton est créée.
Puis, dans le même test j'appelle MultithreadedEngine.getInstance(): une autre instance est créée. Si j'appelle à nouveau l'instance MultithreadedEngine.getInstance() ou l'instance qu'il y a dans les ejb il n'y a pas de nouvelles instance de créées, les références que j'obtient sont vers chacune des deux instances créés.
Je suis sûr que ce sont deux instances différentes: leurs adresses sont différentes, et j'ai fait divers tests pour m'assurer qu'il s'agissait bien de deux instances différentes.
Pour résumer, il y a deux instances du singleton: une pour les ejb, une pour les autres classes.
Est-ce que c'est une histoire de jvm? Sous Jboss, en utilisant les ejb, est-ce qu'il y a toujours qu'une seule jvm (j'utilise pas de clustering pour l'instant)? Ca n'a pas l'air de venir d'un problème de threads en tous cas.