2010-01-11 74 views
2

嘿,伙计们,我在这里有一个有趣的一个!RMI绑定相同的对象两次,但呈现不同的接口

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

基本上,此刻我有它在rmiregistry中设置,这样它就绑定两次,第一次为“ISCP”,而一旦“CSCP”。

但是,当客户端尝试绑定(请记住,他们只知道CSCP接口),他们得到一个异常说,他们无法找到类ISCP - 但他们应该没有必要吧。

那么,如何有一个对象(服务器)上的两个不同的rmibindings存在两种不同的RMI接口,让他们分开?

如果你可以为我解决这个问题,那么你是一个天才:D如果我不清楚,请告诉我!

回答

1

我建议写两个适配器类,一旦它实现ICSP,和一个它实现CSCP。这些适配器类中的每个方法都会在“真实”对象中调用适当的方法。

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

即使有只有一个接口,这将是很好的做法,无论如何,因为它通常是从他们与(RMI在这种情况下)通信的远程传输机制解耦业务对象是个好主意。不得不导出两个远程接口使这种情况更加严重。

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

有没有办法在纯代码中做到这一点?我没有得到这个东西是什么 ...我们没有使用IDE或任何类型的任何东西! – Ben 2010-01-11 23:20:59

+0

那么,如果你有Spring库,是的。以上内容与IDE无关 - 只是使用Spring XML配置来描述运行时部署(即实例化什么,如何连线协作实例等)。这非常值得熟悉。我虽然修改了我的答案 – 2010-01-11 23:37:37

相关问题