是否可以使用多个对象进行RMI通信

时间:2010-09-15 14:06:59

标签: java performance rmi

情景:

  • 客户端C通过RMI连接到服务器S
  • C要求S创建处理程序H,S将H返回到C
  • C然后与H
  • 交谈

现在我可以用两种方式做到这一点:

  • 让处理程序成为Remote并让S将存根返回给它,这样C就可以直接与它交谈(h.say(String msg);
  • 给处理程序一个ID并将其返回给C. C将通过S(s.sayToHandler(int id, String msg);
  • 与H交谈

第一个是更好的OO,但性能如何呢?是否会打开额外的TCP连接,或者是否使用了S和H之间的现有连接?

2 个答案:

答案 0 :(得分:2)

我不知道实施情况。我不认为有新的连接。但我所知道的是,远程共享的对象越多,依赖远程取消引用来获取垃圾的对象就越多(因此会有更多的对象长寿,不好)。

替代方法

我会推荐一种混合方法。对客户端使用漂亮的方法,但在内部实现它不那么好的方法:

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是同步接口。第一个方法有Handler作为参数,后者有纯方法。我不认为这是一个大问题。这两个不同的界面让您干净利落地工作,而客户端一无所知,并允许瘦的可序列化处理程序执行肮脏的工作。

希望你喜欢它!

答案 1 :(得分:1)

RMI规范并未真正说明是否应该重新使用新连接或现有连接。有线协议允许使用multiplexing或每次调用一个TCP连接(可能会重复用于跟随对同一服务器对象的调用,我不确定)。如果您需要通过HTTP进行隧道传输,则每个连接只允许一条消息。

我没有找到任何关于如何配置要使用的协议类型的内容(除了禁用HTTP隧道)。

如果要确保只使用一个TCP连接,请使用自定义客户端和服务器套接字工厂自行进行多个连接的隧道连接。这可能不如RMI运行时系统在那里做的那么有效。