我有一个测试程序T:
- 从服务器S
Remote
上的 RMI 注册表获取对象 O 的存根 - 在数百个并行线程中,调用此对象O上的方法。
我可以看到服务器S有许多“RMI TCP 连接”线程。我原以为只有一个,因为T上只有一个O存根。这是如何运作的?
RMI 需要每个线程的每个端点都有一个连接。它在客户端汇集它们,这反过来也会导致在服务器端汇集,所以它实际上并没有那么糟糕,但是如果你有 1000 个线程同时执行 RMI 调用,那么肯定会有 1000 个连接. 它们不是多路复用的。
如果可能,RMI 应该尝试重用服务器套接字和客户端套接字。
您的情况发生在服务器套接字工厂不相等时(执行 equals 时,结果为 false 并再次建立连接)。也许存根没有实现 hashCode 和 equals,所以没有确定的方法可以知道套接字是否可用。