Mon singleton s'appelle Resources. Il ne doit être instanciée une fois par cette norme Singleton je:Singleton est instancié deux fois dans Glassfish Server
package site.kevindhu.models;
import site.kevindhu.entity.Player;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
public class Resources {
public static Resources resources;
public Map<String, Object> data;
static {
resources = new Resources();
}
private Resources() {
data = new HashMap<>();
data.put("players", new HashSet<Player>());
data.put("newPlayers", new HashSet<Player>());
}
public static Resources getInstance() {
return resources;
}
}
Cependant, il ne fonctionne pas correctement!
Quand je déployez un .ear pour exécuter mon serveur GlassFish, il va dans ce bloc deux fois:
static {
resources = new Resources();
}
En conséquence, la « singleton » crée en fait deux ressources différentes, chacune temps que je cours le serveur.
Je sais que je fais deux fois parce que je débogue il appelle deux objets Ressources différents chaque fois que je tente d'appeler Resources.resources. Est-ce probablement parce que je déploie un fichier .ear? Comment fonctionnent les spécificités de cette double instanciation?
Très probablement votre classe se charge par différents classloaders. En fonction de ce que vous écrivez, un singleton personnalisé comme celui-ci n'est probablement pas la meilleure des idées dans un serveur d'applications. – pvg
Je voudrais également suggérer que c'est un problème de classloader. Y a-t-il plusieurs fichiers WAR dans votre fichier EAR? Chacun aura probablement son propre ClassLoader, et donc une instance distincte de Resources. Voir [cette réponse] (https://stackoverflow.com/a/4132721/3586783) pour un peu plus d'informations. – pacifier21
J'ai effectivement changé mon déploiement en un fichier .war, et cela se produit toujours. –