我有一个名为Server的对象,它实现了两个RMI接口,即CSCP和ISCP。 我需要我的客户端能够在RMI CSCP接口上进行通信,但对ISCP接口一无所知,我需要其他服务器在ISCP接口上与它通信,但对CSCP接口一无所知。和我一起到目前为止?
基本上,目前我已将它设置为两次绑定,一次绑定到rmiregistry中的“ISCP”,一次绑定到“CSCP”。
但是,当客户端尝试绑定时(请记住他们只知道CSCP接口),他们会得到一个例外,说他们找不到ISCP类 - 但他们应该不需要它。
那么,如何让一个对象(Server)在两个不同的rmibinding上呈现两个不同的RMI接口,将它们分开?
如果你能为我解决这个问题,你就是天才:D如果我不够清楚,请告诉我!
答案 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