我正在研究Java RMI主题,并且需要有关客户端连接池的一些信息。在文献和文献中没有明确的答案这些主题。我知道连接池不是RMI规范的一部分。但是在一些实现中(例如在SUN的实现中),它已经完成。所以我的问题就是这个实现。
我认为由RMI套接字工厂创建的套接字(java.net.Socket)缓存在池中。这是对的吗?
如何保存这些连接?除了使用HashMap与目标ip / port作为密钥,套接字作为值。
使用超时关闭套接字。如何获得连接空闲时间的信息?可能在最后一次使用连接时存在某种时间戳。
答案 0 :(得分:2)
请记住,我只是在讨论Sun实施:
我猜想由socket创建的socket(java.net.Socket) RMI套接字工厂缓存在池中。这是对的吗?
是的,从远程调用中释放后,当然远程调用首先在池中查找,然后要求套接字工厂创建一个新的Socket。
如何保存这些连接?我会使用HashMap 目的地ip / port为密钥,套接字为value。
我们只是说从逻辑上讲必须是从ip:port到Socket的Map。实施细节实际上并不重要。
使用超时关闭套接字。信息如何? 连接空闲时间到了吗?
注意连接放入池中的时间。
答案 1 :(得分:0)
在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。
BTW可能(全局)限制处理线程(-Dsun.rmi.transport.tcp.maxConnectionThreads=unlimited
)在接受方。