java - 使用多个对象进行RMI通信可以吗

标签 java performance rmi

场景:

  • 客户端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/

相关文章:

具有可调用功能的 Java RMI

Java 独立网络摄像头应用程序

javascript - 纯静态 html 文件与内容通过 JS 和 noSQL 加载的静态 html 文件之间的性能

java - 简单的 Java 小程序无法在 MacOS 上的 FireFox/Safari 中加载

sql - 存储过程执行得非常糟糕 - 增加超时或修复问题

javascript - 加速改变 div 元素颜色的 JavaScript 函数构造 'led display'

Java RMI 无法绑定(bind)服务器

java - RMI 服务器不会从其 HTTP 代码库服务器动态加载缺失的类

java - 让 Java 运行时忽略 serialVersionUIDs?

java - 没有活跃的管理员拥有... - 在 Android 中锁定屏幕