场景:
- 客户端C通过RMI连接到服务器S
- C 要求 S 创建处理程序 H,S 将 H 返回给 C
- C 然后与 H 对话
现在我可以通过两种方式做到这一点:
- 将处理程序设置为
Remote
,并让 S 将 stub 返回给它,以便 C 可以直接与之对话 (h.say(String msg);
)< - 为处理程序提供一个 ID 并将其返回给 C。C 将通过 S 与 H 对话 (
s.sayToHandler(int id, String msg);
)
第一个是更好的 OO,但是性能怎么样?是否会打开额外的 TCP 连接,还是使用 S 和 H 之间现有的连接?
最佳答案
我不知道实现情况。我认为不会建立新的联系。但我知道的是,您远程共享的对象越多,依赖远程取消引用来进行垃圾收集的对象就越多(因此会有更多的对象生命周期更长,这不好)。
替代方法
我会推荐一种混合方法。对客户端使用好的方法,但在内部以不太好的方式实现它:
interface Server {
public Handler getHandler(...);
}
interface Handler extends Serializable {
// it gets copied!
public X doThis(...);
public Y doThat(...);
}
class HandlerImpl implements Handler {
public X doThis(...) {
backDoor.doThis(this, ...);
}
public Y doThat(...) {
backDoor.doThat(this, ...);
}
private BackDoor backDoor;
}
interface BackDoor {
public X doThis(Handler h, ...);
public Y doThat(Handler h, ...);
}
class ServerImpl imlpements Server, BackDoor {
public Handler getHandler(...) {
return /*a handler with a self reference as backdoor, only ONE remote obj shared via TWO interfaces */
}
...
// it does everything
// it receives the handler
}
BackDoor 和 Handler 是同步接口(interface)。第一个具有以 Handler 作为参数的方法,后者具有纯方法。我认为这没什么大不了的。这两个不同的接口(interface)让您可以干净地工作,而无需客户端一无所知,并允许瘦可序列化处理程序完成肮脏的工作。
希望你喜欢!
关于java - 使用多个对象进行RMI通信可以吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3718412/