分析一:
private class Connection extends Thread {
….......
this.setDaemon(true);
}
/** Thread that reads responses and notifies callers. Each connection owns a socket connected to a remote address. Calls are multiplexed through this socket: responses may be delivered out of order. */
这句话我的理解是:1)connection类只是一个daemon线程——即生来就是为别人服务的,为别人服务完自己就死掉了;2)读取应答信息&&通知调用者-在我看来更像是一个客户端的存根(client stub) 解释一下: Client stub is responsible for “marshalling”(编号) arguments and
“unmarshalling” the return values
。图表(图表1)
可以看到是client stub(客户端的存根)真正执行的socket连接。其实那句英文解释也印证了我的推理:
Each connection owns a socket connected to a remote address。-一个conection对应一个socket连接
3):多个calls是复用在这个socket上的。
总结:可以看到connection终究是一个线程而且是daemon线程,所以他的职责就是连接管理内部线程类,是一个连接线程。
那么如何区分每一个连接,显然不是考connection类来管理的,那是靠什么吗?
分析二:-ConnectionId内部类:
官方解释是:
/**
* This class holds the address and the user ticket. The client connections
* (to servers) are uniquely identified by
*/
private static class ConnectionId {
….......
ConnectionId(InetSocketAddress address, Class protocol,
UserGroupInformation ticket) {
this.protocol = protocol;
this.address = address;
this.ticket = ticket;
}
….....
}
解读:连接服务器的用户连接s是依靠3元组来区别的3者共同决定了连接,如果有一个不同就不是一个连接-同一个用户,连接到同一个实现了同一个协议的远程地址时,连接是一样的。在这个连接上当然是允许许多不同的call的,也就是上面说所的多路复用的socket的意思。(引出分析3)可以看到起构造函数中初始化了这3个参数,因而决定了一个特定的connection连接。
分析三:
说到了一个conneciton上可以有多个call来复用,也就引出了hadoop的RPC机制和java动态代理的:
“可以这样说是现有RPC机制解决,然后用java的动态代理机制解决RPC多个客户端连接一个服务器的”——通过动态代理可以得到调用server的那个call。
分析四:
对于每一个connection线程,可以说是他对应一个socket连接,connections集中在一个 线程池中来管理的。