【问题标题】:When does RMI make TCP connections?RMI 何时建立 TCP 连接?
【发布时间】:2012-07-10 15:27:05
【问题描述】:

我有一个测试程序T

  • 从服务器 S 上的 RMI 注册表获取 Remote 对象 O 的存根
  • 在数百个并行线程中,调用此对象上的方法O

我可以看到服务器 S 有许多“RMI TCP 连接”线程。我原以为只有一个,因为 T 上只有一个 O 存根。这是如何工作的?

【问题讨论】:

  • 你在线程转储中看到了吗?这是哪台服务器?
  • @ChinBoon 我在 VisualVM 中看到了。它是托管Remote 对象的服务器。

标签: java rmi


【解决方案1】:

RMI 需要每个线程的每个端点都有一个连接。它在客户端汇集它们,这反过来也会导致在服务器端汇集,所以它实际上并没有那么糟糕,但是如果你有 1000 个线程同时执行 RMI 调用,那么肯定会有 1000 个连接.它们不是多路复用的。

【讨论】:

  • 好的,那么我将不得不减少测试程序中的线程数,因为这并不能反映它应该模拟的真实客户端中的实际线程数。
【解决方案2】:

如果可能,RMI 应该尝试重用服务器套接字和客户端套接字。

当服务器套接字工厂不相等时会发生您的情况(执行equals时,结果为false并再次建立连接)。可能stub没有实现hashCode和equals,所以无法确定socket是否可用。

【讨论】:

  • 存根没什么特别的,只是UnicastRemoteObject.export
  • 必须相等的是 client 套接字工厂,而不是服务器套接字工厂。他的情况也发生在即使 with 'equal' 套接字工厂也有并发调用时,他有 1000 个。所有 RMI 存根都实现了 equals() 和 hashCode() 但它与这个问题完全无关。 “无法确定是否可以使用套接字”是没有意义的。投反对票。
猜你喜欢
  • 2012-11-11
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 2020-04-05
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
相关资源
最近更新 更多