美文网首页
NodeClient

NodeClient

作者: 愚公300代 | 来源:发表于2016-12-08 17:33 被阅读179次

    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的映射

    待续

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

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

    TransportAction的具体绑定者

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

    GenericAction和TansportAction的映射

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

    相关文章

      网友评论

          本文标题:NodeClient

          本文链接:https://www.haomeiwen.com/subject/fpgiuttx.html