2010-01-11 10 views
2

Hé les gars, j'en ai un intéressant pour vous ici!RMI liant le même objet deux fois mais présentant des interfaces différentes

J'ai un objet, appelé Server, qui implémente deux interfaces RMI, CSCP et ISCP. J'ai besoin de mes clients pour pouvoir communiquer sur l'interface RMI CSCP, mais je ne sais rien de l'interface ISCP, et j'ai besoin d'autres serveurs pour communiquer avec l'interface ISCP mais je ne sais rien de l'interface CSCP. Avec moi jusqu'ici? Fondamentalement, au moment où je l'ai mis en place de sorte qu'il se lie deux fois, une fois à "ISCP" dans le répertoire, et une fois à "CSCP". Cependant, lorsque les clients tentent de se lier (gardez à l'esprit qu'ils ne connaissent que l'interface CSCP), ils obtiennent une exception disant qu'ils ne peuvent pas trouver le classe ISCP - mais ils ne devraient pas en avoir besoin. Alors, comment un objet (serveur) présente-t-il deux interfaces RMI différentes sur deux contrôleurs différents, en les séparant?

Vous êtes un génie si vous pouvez résoudre celui-ci pour moi: D Si je n'étais pas assez clair faites le moi savoir!

Répondre

1

Je suggère d'écrire deux classes d'adaptateur, une fois qui met en œuvre ICSP, et qui met en œuvre CSCP. Chaque méthode de ces classes d'adaptateur appelle la méthode appropriée dans l'objet "real".

Vous liez ensuite chacune de ces classes d'adaptateur à RMI, sous un nom différent, au lieu de lier l'objet d'origine. Les clients peuvent récupérer n'importe quel objet lié, selon l'interface dont ils disposent.

Même s'il n'y a qu'une seule interface, ce serait une bonne pratique, car c'est généralement une bonne idée de découpler vos objets métier du mécanisme de transport distant avec lequel ils communiquent (RMI dans ce cas). Avoir à exporter deux interfaces distantes rend ce cas encore plus fort.

0

Essayez d'utiliser Spring remoting et lient le même objet sous différents noms en utilisant différentes interfaces - il utilise la réflexion pour lier un objet Java (à savoir n'a pas besoin de mettre en œuvre Remote) et de même pour rechercher et appeler des méthodes.

<bean class="org.springframework.remoting.rmi.RmiServiceExporter"> 
    <property name="serviceName" value="ICSP"/> 
    <property name="service" ref="myService"/> 
    <property name="serviceInterface" value="example.ICSP"/> 
</bean> 

<bean class="org.springframework.remoting.rmi.RmiServiceExporter"> 
    <property name="serviceName" value="CSCP"/> 
    <property name="service" ref="myService"/> 
    <property name="serviceInterface" value="example.CSCP"/> 
</bean> 

Ceux-ci peuvent être utilisés en utilisant programme seulement les bibliothèques de printemps:

RmiServiceExporter e = new RmiServiceExporter(); 
e.setServiceName("SCSP"); 
e.setService(myServiceObj); 
e.setServiceInterface(example.SCSP.class); 
e.prepare(); // read the doc; I'm not sure this is the exact method 
+0

Y a-t-il un moyen de le faire en code pur? Je ne comprends pas ce qu'est ce truc ... Nous n'utilisons pas un IDE ou quoi que ce soit d'autre! – Ben

+0

Eh bien, si vous avez les bibliothèques Spring, oui il y a. Ce qui précède n'a rien à voir avec un IDE - il utilise simplement la configuration Spring XML pour décrire un déploiement à l'exécution (à savoir quoi instancier, comment câbler des instances collaborantes, etc.). Cela vaut la peine de se familiariser avec. Je modifie ma réponse –