RMI绑定相同的对象两次,但呈现不同的接口

时间:2010-01-11 22:43:46

标签: java binding interface rmi

嘿伙计们,我在这里有一个有趣的人!

我有一个名为Server的对象,它实现了两个RMI接口,即CSCP和ISCP。 我需要我的客户端能够在RMI CSCP接口上进行通信,但对ISCP接口一无所知,我需要其他服务器在ISCP接口上与它通信,但对CSCP接口一无所知。和我一起到目前为止?

基本上,目前我已将它设置为两次绑定,一次绑定到rmiregistry中的“ISCP”,一次绑定到“CSCP”。

但是,当客户端尝试绑定时(请记住他们只知道CSCP接口),他们会得到一个例外,说他们找不到ISCP类 - 但他们应该不需要它。

那么,如何让一个对象(Server)在两个不同的rmibinding上呈现两个不同的RMI接口,将它们分开?

如果你能为我解决这个问题,你就是天才:D如果我不够清楚,请告诉我!

2 个答案:

答案 0 :(得分:1)

我建议编写两个适配器类,一个实现ICSP,另一个实现CSCP。这些适配器类中的每个方法都调用“真实”对象中的相应方法。

然后,您可以使用其他名称将每个适配器类绑定到RMI,而不是绑定原始对象。客户端可以根据他们所拥有的界面检索他们想要的任何绑定对象。

即使只有一个接口,这仍然是一种很好的做法,因为将业务对象与它们通信的远程传输机制(在本例中为RMI)分离通常是个好主意。必须导出两个远程接口才能使这种情况更加强大。

答案 1 :(得分:0)

尝试使用Spring remoting使用不同的接口绑定相同的对象 - 它使用反射绑定任何 Java对象(即不需要实现Remote),类似于查找和调用方法。

<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>

可以使用Spring库以编程方式使用它们:

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