我正在研究Java RMI主题,需要一些有关客户端连接池的信息。在文献和文档中,这些主题没有明确的答案。我知道连接池不是 RMI 规范的一部分。但是在某些实现中(例如在SUN的实现中),它是完成的。所以我的问题指的是这个实现。
我想由RMI套接字工厂创建的套接字(java.net.Socket)缓存在池中。这是对的吗?
如何保存这些连接?我除了使用哈希映射与目标 ip/端口作为键和套接字作为值一起使用。
使用超时关闭套接字。如何获得有关连接空闲时间的信息?上次使用连接时可能存在某种时间戳。
请记住,我只谈论 Sun 实现:
是的,在从远程调用中我想套接字(java.net.Socket)是由 RMI 套接字工厂缓存在池中。这是对的吗?
释放它之后,当然远程调用在要求套接字工厂创建新的套接字之前首先在池中查找。
如何保存这些连接?除了使用哈希映射之外,我会 以目标 IP/端口作为密钥,以套接字作为值。
假设逻辑上必须有一个从ip:port到Socket的映射。实现细节实际上并不重要。
使用超时关闭套接字。信息如何 获得连接空闲时间?
通过记下将连接放入池的时间。
在 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
中作为弱哈希图。
顺便说一下,在接受端存在处理线程(-Dsun.rmi.transport.tcp.maxConnectionThreads=unlimited
)的可能(全局)限制。