NodeClient

NodeClient源代码

client具体绑定者

在NodeClientModule类中说明了Client被绑定到NodeClient:

bind(Client.class).to(NodeClient.class).asEagerSingleton();

注:NodeClient和TransportClient及其它Client的关系、作用、区别会在接下来地源码中分析

继承层次信息

如下图是NodeClient的继承信息,


NodeClient_第1张图片
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 > void execute(Action action, Request request, ActionListener listener) {
        headers.applyTo(request);
        listener = threadedWrapper.wrap(listener);
        doExecute(action, request, listener);
    }
   ...
    @Override
    public void get(final GetRequest request, final ActionListener listener) {
        execute(GetAction.INSTANCE, request, listener);
    }

类NodeClient作为实际使用的客户端,承担通过GenericAction和TransportAction的映射选择实际TransportAction的责任。

public class NodeClient extends AbstractClient {

    private final ImmutableMap actions;  
    ...
    @SuppressWarnings("unchecked")
    @Override
    public > void doExecute(Action action, Request request, ActionListener listener) {
        TransportAction 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映射为例的源代码组织如下:


NodeClient_第2张图片
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的映射

待续

要理解这个调用堆栈及其行为需要补充三点信息:

  1. client具体绑定者
  2. 具体调用依据的源码
  3. TransportAction的具体绑定者

TransportAction的具体绑定者

TranportAction的具体绑定者从GenericAction和TansportAction的映射来具体说明。

GenericAction和TansportAction的映射

此处主要说明下面的内容
1.映射结构源代码结构的组织
2.private final ImmutableMap actions 地注入
3.为什么要构建此映射,构建此映射的好处是?

你可能感兴趣的:(NodeClient)