NodeClient源代码
client具体绑定者
在NodeClientModule类中说明了Client被绑定到NodeClient:
bind(Client.class).to(NodeClient.class).asEagerSingleton();
注:NodeClient和TransportClient及其它Client的关系、作用、区别会在接下来地源码中分析
继承层次信息
如下图是NodeClient的继承信息,
NodeClient2.png
其父类AbstractClient源码说明通过NodeClient发出的请求都通过doExecute()地执行来实现,其中get方法的调用堆栈为:
Client.get() <- AbstractClient.execute() <- NodeClient.doExecute() <- TransportAction.execute()
关键调用源码:
/**
*AbstractClient.class
* This is the single execution point of *all* clients.
* excute()方法作为所有client的入口方法
*/
@Override
public final <Request extends ActionRequest, Response extends ActionResponse, RequestBuilder extends ActionRequestBuilder<Request, Response, RequestBuilder>> void execute(Action<Request, Response, RequestBuilder> action, Request request, ActionListener<Response> listener) {
headers.applyTo(request);
listener = threadedWrapper.wrap(listener);
doExecute(action, request, listener);
}
...
@Override
public void get(final GetRequest request, final ActionListener<GetResponse> listener) {
execute(GetAction.INSTANCE, request, listener);
}
类NodeClient作为实际使用的客户端,承担通过GenericAction和TransportAction的映射选择实际TransportAction的责任。
public class NodeClient extends AbstractClient {
private final ImmutableMap<GenericAction, TransportAction> actions;
...
@SuppressWarnings("unchecked")
@Override
public <Request extends ActionRequest, Response extends ActionResponse, RequestBuilder extends ActionRequestBuilder<Request, Response, RequestBuilder>> void doExecute(Action<Request, Response, RequestBuilder> action, Request request, ActionListener<Response> listener) {
TransportAction<Request, Response> transportAction = actions.get(action);
if (transportAction == null) {
throw new IllegalStateException("failed to find action [" + action + "] to execute");
}
transportAction.execute(request, listener);
}
}
doExecute作为实际动作的执行者,在这个方法中,通过actions的映射获取实际的TransportAcion执行相应的动作。而actions被注入的代码在ActionModule类中:
registerAction(GetAction.INSTANCE, TransportGetAction.class);
我们进一步考察GenericAction和TransportAction的继承层次会得出下列源代码的组织结构:
映射结构源代码结构的组织
以GetAction和TransportGetAction映射为例的源代码组织如下:
NodeClient3.png
此结构说明对于每个GenericAction都有一个对应的TransportAction
GetAction包括action的名字和一个具体实例
public static final GetAction INSTANCE = new GetAction();
public static final String NAME = "indices:data/read/get";
TransportGetAction
为了突出重要代码,进行了一些简化,上述代码主要有两个关注点:
- 继承层次信息
- GenericAction和TansportAction的映射
待续
要理解这个调用堆栈及其行为需要补充三点信息:
- client具体绑定者
- 具体调用依据的源码
- TransportAction的具体绑定者
TransportAction的具体绑定者
TranportAction的具体绑定者从GenericAction和TansportAction的映射来具体说明。
GenericAction和TansportAction的映射
此处主要说明下面的内容
1.映射结构源代码结构的组织
2.private final ImmutableMap<GenericAction, TransportAction> actions 地注入
3.为什么要构建此映射,构建此映射的好处是?
网友评论