0

我试图了解如何以及何时在一个非常简单的应用程序中创建 RMI 连接。

server = new RemoteServer();
registry = LocateRegistry.createRegistry(PORT);
registry.bind("Remote", server);

客户端部分是:

registry = LocateRegistry.getRegistry(HOST, PORT);
remote = (IRemoteServer) registry.lookup("Remote");

假设 remote 已经定义了一些方法doSomething()。现在,假设一切都已正确设置并正常工作,我试图了解 TCP 连接的确切时间。

  • 我打电话时是否建立了连接lookup(),并且每次我打电话时都会重复使用相同的连接remote.doSomething()?如果我lookup()第二次打电话,那会创建第二次连接吗?
  • 还是每次我打电话时都会创建一个新连接remote.doSomething(),然后再拆除?

这个问题有点相关,但它谈论的是多个线程对单个远程对象调用调用。)

4

1 回答 1

2

创建 RMI 连接时

没有单一的“RMI 连接”,所以这个问题已经不正确了。

当我调用 lookup() 时是否建立了连接

是的,可能,见下文。

每当我调用 remote.doSomething() 时,相同的连接会被重用吗?

可能,请参见下文,如果远程对象与注册表位于同一 host:port 上;否则肯定会有新的 TCP 连接。

如果我第二次调用lookup(),会创建第二个连接吗?

可能,见下文。

还是每次我调用 remote.doSomething() 时都会创建一个新连接,然后再拆除?

可能不是。

这些都没有指定,但是 Sun/Oracle 实现会在各种RMI 系统属性的控制下进行客户端连接池,特别是sun.rmi.transport.tcp.threadKeepAliveTime.默认情况下,空闲超过 60 秒的连接将被关闭。以前是15秒。

于 2013-08-30T00:21:08.480 回答