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

Langage Java Discussion :

Donnees communes a plusieurs Serveurs


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2004
    Messages : 201
    Par défaut Donnees communes a plusieurs Serveurs
    Bonjour,

    J'ai fait une appli qui au lancement de celle-ci cree plusieurs servers. (serverSocket), chaqun de ces serveur peut donc accpeter des connections et donc creer plusieurs threads.
    Le souci est que tous ces serveurs auraient besoin de "communiquer" entre eux, ou pouvoir consulter tous les memes variables. Creer une partie "commune" en gros.
    Je pensai donc creer une classe avec des valeurs static, et mettre dedan touts les champs que je voudrai rendre accessible a mes differents serveurs...
    les server accederont/modifiront ces val de facon synchronisee.

    Qu'est ce que vous en pensez ?

  2. #2
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    C'est une façon de faire (c'est un peu comme cela que marchent les IPC)... Attention à la synchronisation !
    Sinon tu peux utiliser RMI également.

  3. #3
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2004
    Messages : 201
    Par défaut
    OK merci du tuyau !

    edit: Il n'y aura pas de prob de synchronisation avec RMI ?

  4. #4
    Membre expérimenté
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Par défaut
    Bonjour,
    le RMI c'est surtout entre jvm différentes.
    plutôt que d'avoir plusieurs éléments statiques, mieux vaut un singleton (basé sur un seul statique) qui contient des attributs d'instances (normaux).
    ça permet d'avoir plus de polymorphisme sur ta classe au besoin (pas d'override sur les static) et éventuellement d'avoir plusieurs instance le jour ou ce n'est plus un singleton.

    la synchronisation il suffit de le faire à l'écriture (sur tes set()) et c'est bon.

  5. #5
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2004
    Messages : 201
    Par défaut
    Citation Envoyé par deltree Voir le message
    mieux vaut un singleton (basé sur un seul statique) qui contient des attributs d'instances (normaux)
    Merci mais je vois pas trop ce que c'est
    t'as une petite demo sous la main

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    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
    21
    22
    public class Singleton {
         /**
          * Création de l'instance au niveau de la variable.
          */
         private static final Singleton INSTANCE = new Singleton();
     
         /**
          * La présence d'un constructeur privé supprime
          * le constructeur public par défaut.
          */
         private Singleton() {}
     
         /**
          * Dans ce cas présent, le mot-clé synchronized n'est pas utile.
          * L'unique instanciation du singleton se fait avant
          * l'appel de la méthode getInstance(). Donc aucun risque d'accès concurrents.
          * Retourne l'instance du singleton.
          */
         public static Singleton getInstance() {
             return INSTANCE;
         }
     }

  7. #7
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2004
    Messages : 201
    Par défaut
    Merci!

    Je vais tester tout ca

  8. #8
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2004
    Messages : 201
    Par défaut
    Re,

    J'ai un petit probleme avec le singleton.
    Mon appli etant , mon appli etant multithread, plusieurs threads acceedent a des methodes ou des elements (listes) de cette classe singleton, et parfois j'ai ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    java.util.ConcurrentModificationException
            at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
            at java.util.AbstractList$Itr.next(Unknown Source)
            at monitor.ping.PingSenderThread.run(PingSenderThread.java:51)
            at java.lang.Thread.run(Unknown Source)
    Ca appartait qund je parcours des listes de cette classe via un iterator.
    Comment y remedier.

  9. #9
    Membre expérimenté
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Par défaut
    synchronized

  10. #10
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2004
    Messages : 201
    Par défaut
    oui je sais bien mais on m'a dit de plutot utiliser les classes singleton.
    comment faire ?

    faut ke je mette toutes mes methodes/attributs de cette classe en synchronized ?

  11. #11
    Membre expérimenté
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Par défaut
    Citation Envoyé par metalcoyote Voir le message
    oui je sais bien mais on m'a dit de plutot utiliser les classes singleton.
    comment faire ?

    faut ke je mette toutes mes methodes/attributs de cette classe en synchronized ?
    non juste tes methods on ne synchronize pas les attributs!

  12. #12
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2004
    Messages : 201
    Par défaut
    ouip c vrai
    Bon ca pete quand meme...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ArrayList<MonitorBean> monitorsList_ = MonitorActions.getInstance().getConfig().getMonitorList();
    Iterator<MonitorBean> it_ = monitorsList_.iterator();
     
    ArrayList<MonitorBean> monitorsList_ = MonitorActions.getInstance().getConfig().getMonitorList(); 
    		  Iterator<MonitorBean> it_ = monitorsList_.iterator();					
     
    for (Iterator<MonitorBean> iterator = it_; iterator.hasNext();) {
    	MonitorBean monitor = (MonitorBean) iterator.next();  <-- ICI
    ...
    }
    Pourtant ya "synchronized" sur la methode getMonitorList()

  13. #13
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Salut,

    La methode est synchronisée, la liste ne l'est pas.

    Plusieurs solutions :
    • sychroniser la liste :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      List monitorsList_=Collections.synchronizedList(MonitorActions.getInstance().getConfig().getMonitorList());
    • synchroniser le temps de l'itération :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
       
      sychronized(monitorsList_)
      {
      		  Iterator<MonitorBean> it_ = monitorsList_.iterator();
       
      		  ArrayList<MonitorBean> monitorsList_ = MonitorActions.getInstance().getConfig().getMonitorList(); 
      		   Iterator<MonitorBean> it_ = monitorsList_.iterator();					
       
      		  for (Iterator<MonitorBean> iterator = it_; iterator.hasNext();) 
      		  {
      			  MonitorBean monitor = (MonitorBean) iterator.next();  <-- ICI
      		  }
      ...
      }

    Dans tous les cas, si tu as un probleme d'acces concurent, synchroniser uniquement les méthodes ne fonctionnera pas, puisque tu travailles sur les objets renvoyés par ces méthodes.

    edit:vas faire un tour ici pour des infos sur la synchronisation des collections.

    Cordialement

    Fred

  14. #14
    Membre expérimenté
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Par défaut
    synchronize tes liste aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Collections.synchronizedList(List<T> list)

  15. #15
    Membre émérite Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Par défaut
    Il faut que acquiers le verrou sur ta liste avant de récupérer l'iterator pour pouvoir la parcourir sans souci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    synchronized(list)
    {
        for(Iterator it=list.iterator(); it.next();)
        {
             //traitement
        }
    }

  16. #16
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2004
    Messages : 201
    Par défaut
    Merci beaucoup !

    Je vais voir tout ca

  17. #17
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il pourrait également être intéressant de se pencher sur les ReadWriteLock de Java 5.0 et gérer toute la synchronisation à la main...

    Cela permettrait d'éviter des blocages lorsque tous les threads accède à la liste seulement en lecture...

    a++

  18. #18
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2004
    Messages : 201
    Par défaut
    je note je note

  19. #19
    Membre émérite Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Par défaut
    La classe CopyOnWriteArray peut aussi etre une piste

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/06/2013, 19h22
  2. Objet commun a plusieur DLL
    Par petitcoucou31 dans le forum Langage
    Réponses: 2
    Dernier message: 10/12/2003, 23h07
  3. IP et plusieurs serveurs
    Par Joelindien dans le forum Hardware
    Réponses: 8
    Dernier message: 03/11/2003, 13h46
  4. [SSL]Communication avec un serveur en https
    Par menon dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 04/09/2003, 17h38
  5. [configuration] lancer plusieurs serveurs Tomcat
    Par polo54 dans le forum JBuilder
    Réponses: 4
    Dernier message: 13/06/2003, 16h52

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