4

我正在研究 Java RMI 主题,需要一些有关客户端连接池的信息。在文献和文档中,这些主题没有明确的答案。我知道连接池不是 RMI 规范的一部分。但是在某些实现中(例如在 SUN 的实现中)它已经完成了。所以我的问题是指这个实现。

我假设由 RMI 套接字工厂创建的套接字(java.net.Socket)缓存在池中。那是对的吗?

这些连接是如何保存的?除了将 HashMap 与目标 ip/port 作为键和套接字作为值一起使用之外,我会。

使用超时关闭套接字。连接空闲时间的信息是如何获得的?上次使用连接时可能存在某种时间戳。

4

2 回答 2

2

请记住,我只是在谈论 Sun 实现:

我假设由 RMI 套接字工厂创建的套接字(java.net.Socket)缓存在池中。那是对的吗?

是的,在它从远程调用中释放之后,当然远程调用在它要求套接字工厂创建一个新的套接字之前首先在池中查找。

这些连接是如何保存的?除了将 HashMap 与目标 ip/port 作为键和套接字作为值一起使用之外,我会。

假设在逻辑上必须有一个从 ip:port 到 Socket 的 Map。实现细节实际上并不重要。

使用超时关闭套接字。连接空闲时间的信息是如何获得的?

通过注意将连接放入池中的时间。

于 2012-04-10T10:15:52.323 回答
1

在 Oracle/OpenJDK 中,到某个端点(对于某个通道)的(空闲)连接列表在List<TCPConnectiont> sun.rmi.transport.tcp.TCPChannel#freeList. 没有最大尺寸。有一个收割线程检查套接字是否空闲超过 15 秒(-Dsun.rmi.transport.connectionTimeout=15000)。

通道存储Map<TCPEndpoint,Reference<TCPChannel>> sun.rmi.transport.tcp.TCPTransport#channelTable为 WeakHashMap。

-Dsun.rmi.transport.tcp.maxConnectionThreads=unlimited顺便说一句,接受端的处理线程 ( ) 存在一个可能的(全局)限制。

于 2013-12-22T06:28:08.637 回答