IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs Discussion :

Le singleton en environnement clusterisé


Sujet :

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 74
    Points : 68
    Points
    68
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 74
    Points : 68
    Points
    68
    Par défaut
    J'ai trouvé d'où vient le problème: il y a deux instances du singleton, parce qu'il y a plusieurs jvm: une pour les conteneurs EJB et une pour le client. Il y a bien un singleton par jvm.

    Mais comment faire pour qu'il n'y ait qu'un seul singleton pour toutes les jvm?

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 74
    Points : 68
    Points
    68
    Par défaut
    J'ai essayé d'obtenir le singleton par rmi: je crée le singleton sur la jvm où il y a mes ejbs, et la jvm de mon client demande et obtient le singleton, par rmi. Mais ça ne règle pas le problème: ça à l'air d'être une copie du singleton que je reçoit. Le singleton que je reçoit dans ma jvm client via rmi n'a pas la même référence que le singleton de la jvm de jboss (où il y a les ejbs), et lorsque je change des valeurs du singleton de la jvm de jboss, ces changements ne se répercutent pas sur le singleton de ma jvm client.

    Est-ce qu'il y a un moyen (mémoire partagée?) pour avoir un singleton commun à plusieures jvms, de façon que les changements dans le singleton soient visibles dans toutes ces jvms?

  4. #4
    Membre régulier
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 114
    Points : 101
    Points
    101
    Par défaut
    J'imagine que tu as trouvé la réponse depuis le temps. Mais la solution sous JBoss c'est l'annotation @Service qui te permet d'avoir une seule instance d'EJB pour ton application.

    http://docs.jboss.org/ejb3/app-serve...xtensions.html

Discussions similaires

  1. Singleton en environnement Multithread
    Par alladdin dans le forum Langage
    Réponses: 22
    Dernier message: 13/07/2011, 16h41
  2. Virer l environnement...
    Par Kukrapok dans le forum DirectX
    Réponses: 1
    Dernier message: 18/11/2002, 05h47
  3. [BES] Création d'une variable d'environnement
    Par NGI80 dans le forum Autres
    Réponses: 2
    Dernier message: 17/10/2002, 07h31
  4. nom de fichier et variables d'environnement
    Par joebarthib dans le forum Langage
    Réponses: 2
    Dernier message: 18/07/2002, 15h21
  5. Réponses: 4
    Dernier message: 18/07/2002, 13h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo