NodeClient

NodeClient源代碼

client具體綁定者

在NodeClientModule類中說明了Client被綁定到NodeClient:

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

注:NodeClient和TransportClient及其它Client的關(guān)系、作用、區(qū)別會(huì)在接下來地源碼中分析

繼承層次信息

如下圖是NodeClient的繼承信息,


NodeClient2.png

其父類AbstractClient源碼說明通過NodeClient發(fā)出的請求都通過doExecute()地執(zhí)行來實(shí)現(xiàn),其中g(shù)et方法的調(diào)用堆棧為:

Client.get() <- AbstractClient.execute() <- NodeClient.doExecute() <- TransportAction.execute()

關(guān)鍵調(diào)用源碼:

    /**
    *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作為實(shí)際使用的客戶端,承擔(dān)通過GenericAction和TransportAction的映射選擇實(shí)際TransportAction的責(zé)任。

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作為實(shí)際動(dòng)作的執(zhí)行者,在這個(gè)方法中,通過actions的映射獲取實(shí)際的TransportAcion執(zhí)行相應(yīng)的動(dòng)作。而actions被注入的代碼在ActionModule類中:

registerAction(GetAction.INSTANCE, TransportGetAction.class);

我們進(jìn)一步考察GenericAction和TransportAction的繼承層次會(huì)得出下列源代碼的組織結(jié)構(gòu):

映射結(jié)構(gòu)源代碼結(jié)構(gòu)的組織

以GetAction和TransportGetAction映射為例的源代碼組織如下:


NodeClient3.png

此結(jié)構(gòu)說明對于每個(gè)GenericAction都有一個(gè)對應(yīng)的TransportAction
GetAction包括action的名字和一個(gè)具體實(shí)例

   public static final GetAction INSTANCE = new GetAction();
    public static final String NAME = "indices:data/read/get";

TransportGetAction

為了突出重要代碼,進(jìn)行了一些簡化,上述代碼主要有兩個(gè)關(guān)注點(diǎn):

  • 繼承層次信息
  • GenericAction和TansportAction的映射

待續(xù)

要理解這個(gè)調(diào)用堆棧及其行為需要補(bǔ)充三點(diǎn)信息:

  1. client具體綁定者
  2. 具體調(diào)用依據(jù)的源碼
  3. TransportAction的具體綁定者

TransportAction的具體綁定者

TranportAction的具體綁定者從GenericAction和TansportAction的映射來具體說明。

GenericAction和TansportAction的映射

此處主要說明下面的內(nèi)容
1.映射結(jié)構(gòu)源代碼結(jié)構(gòu)的組織
2.private final ImmutableMap<GenericAction, TransportAction> actions 地注入
3.為什么要構(gòu)建此映射,構(gòu)建此映射的好處是?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容