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

Persistance des données Java Discussion :

SCJD - Besoin d'aide avec RMI


Sujet :

Persistance des données Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 122
    Par défaut SCJD - Besoin d'aide avec RMI
    Bonsoir a tous,

    J'ai un probleme/exercice de design et je tourne en rond pour le resoudre. Si quelqu'un peut me mettre sur la voix ...

    J'ai un systeme qui permet a un utilisateur de communiquer avec une base de donnee. La BDD peut etre en locale, ou se trouve sur un autre reseau. En local, pas de probleme, j'ai reussi. A distance, je me suis lance dans une solution RMI et pas de probleme egalement, j'y suis arrive (de maniere isolee). Maintenant, je veux faire coexister les 2 solutions et c'est la que les choses se gatent, car quelque soit mon angle d'attaque, je me retrouve avec des interfaces/classes/methodes dupliquees et un casse-tete avec mes exceptions.

    On part de l'interface (simplifiee) suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    package nuriel.db;
     
    public interface Database {
        public String[] read(int recNo) throws RecordNotFoundException;
    }
    Pour me simplifier la vie, je derive cette interface pour y ajouter des methodes qui seront utiles lorsqu'il faudra parler a la couche metier, et je l'implemente.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    package nuriel.db;
     
    public interface DataAccess extends Database {
        public int getTotalNbRecord();
    }
     
    package nuriel.db;
     
    public class DB implements DataAccess { ...}
    En local, la couche metier a juste a faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DabaAccess db = new DB();
    pour travailler. Mais si je suis en reseau, il faut donc exporter un objet DataAccess depuis le serveur. Puisque je travaille en RMI, il faut donc que DataAccess descende de l'interface Remote, et donc que ces methodes lancent une RemoteException, ce qui est une violation du contrat avec Database.

    Ma solution isolee qui marche a ete de dupliquer Database en DatabaseRemote, et toutes ses descendants, en incluant Remote et RemoteException des le depart.
    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
    package nuriel.Remote;
     
    public interface DatabaseRemote extends Remote {
        public String[] read(int recNo) throws RecordNotFoundException, RemoteException;
    }
     
    package nuriel.remote;
     
    public interface DataAccessRemote extends DatabaseRemoter {
        public int getTotalNbRecord() throws RemoteException;
    }
     
    package nuriel.remote;
     
    public class DBRemote implements DataAccessRemote { ... }
    La couche metier l'utilise en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DatabaseAccessRemote db = (DatabaseRemote)registry.lookup(...);
    Et le probleme est que cette solution ne me convient pas car selon que je suis en local ou en reseau, l'objet db est d'un type different (DataAccess ou DataAccessRemote). Et je tourne en rond sur comment faire pour que db soit toujours un DataAccess quelque soit le mode d'access. Toutes propositions seront bienvenues.

    Merci

    Nuriel

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Bonjour,

    Citation Envoyé par nuriel2 Voir le message
    Et le probleme est que cette solution ne me convient pas car selon que je suis en local ou en reseau, l'objet db est d'un type different (DataAccess ou DataAccessRemote). Et je tourne en rond sur comment faire pour que db soit toujours un DataAccess quelque soit le mode d'access. Toutes propositions seront bienvenues.
    Pour quelle raison veux tu que la classe soit la meme dans les 2 modes ?

    Le principe des interfaces c'est justement de ne pas se préoccuper de l'implémentation, et d'utiliser seulement la définition.

    Code java : 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
    23
    24
    // public interface
    public interface Database extends Remote {
        public String[] read(int recNo) throws RecordNotFoundException, RemoteException;
    }
     
    // private implementation for LOCAL
    class DatabaseLocal implements Database {
    	@Override public String[] read(int recNo) throws RecordNotFoundException {
    		return null; // TODO implement local access
    	}
    }
     
    // private implementation for REMOTE (via RMI)
    class DatabaseRemote implements Database {
    	@Override public String[] read(int recNo) throws RecordNotFoundException, RemoteException {
    		return null; // TODO implement RMI access
    	}
    }
     
    // public Factory
    public class DatabaseFactory {
    	public Database getLocalDatabase()  { return new DatabaseLocal(); }
    	public Database getRemoteDatabase() { return new DatabaseRemote(); }
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 122
    Par défaut
    Salut,

    Citation Envoyé par pseudocode Voir le message
    Pour quelle raison veux tu que la classe soit la meme dans les 2 modes ?

    Le principe des interfaces c'est justement de ne pas se préoccuper de l'implémentation, et d'utiliser seulement la définition.
    On est d'accord sur ce point. Je veux que mon objet d'acces a la BDD soit par exemple de type Database quelque soit le mode, ce que tu fais avec ta factory (c'est d'ailleurs une solution que j'explore en ce moment).

    Cependant le code que tu donnes ne peut pas fonctionner dans mon cas, car tu as du modifier Database en lancant une RemoteException sur read. Cette interface m'est imposee et ne peut etre changee. Comme il faut bien que je lance cette exception quelque part, la classe ou je la lance violera obligatoirement Database et ne donc etre une de ces descendantes directe ou indirect.

    Je veux arriver exactement a ce que tu fais, mais sans lancer l'exception dans l'interface racine.

    Nuriel

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Je veux arriver exactement a ce que tu fais, mais sans lancer l'exception dans l'interface racine.
    Si cette exception n'est pas déclarée dans l'interface Database, alors cette interface ne peut pas être utilisée par RMI.

    Le remplacement d'une interface locale par une interface RMI distante ne peut pas se faire de façon transparente, a cause des contraintes imposées par RMI.

    Je ne vous que trois approches possible :
    - ajouter ces contraintes dans l'interface locale (exemple ci-avant)
    - dissocier complètement les 2 interfaces et faire un adaptateur
    - ne pas utiliser RMI mais un autre mécanisme de RPC
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 122
    Par défaut
    Merci de ton aide. J'ai finalement decide de ne pas exporter l'objet d'acces a la base de donnee, mais d'embarquer cet objet dans ma couche metier et d'exporter cette derniere. Cela regle mon probleme pour les exceptions mais j'ai du code duplique. Il n'y a pas vraiment de moyen d'y echapper. Merci encore.

    Nuriel

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

Discussions similaires

  1. Besoin d'aide avec Regexp::Assemble
    Par mobscene dans le forum Modules
    Réponses: 5
    Dernier message: 11/04/2007, 13h39
  2. [ASA] J'ai besoin d'aide avec sybase et vb6 svp !!
    Par tibo830 dans le forum SQL Anywhere
    Réponses: 7
    Dernier message: 12/05/2006, 11h09
  3. Besoin d'aide avec TinyXML
    Par Clad3 dans le forum Bibliothèques
    Réponses: 5
    Dernier message: 15/08/2005, 19h20
  4. Réponses: 2
    Dernier message: 29/08/2003, 18h52
  5. Besoin d'aide avec postgresql sous windows NT
    Par Chihuahua dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 18/07/2003, 09h29

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