elasticsearch中的绝大部分操作都是通过相应的action,这些action在action包中。它的结构如下图所示:
这里展示的是Action包的部分截图,其中包含了各种不同功能对应的Action。各个action的包也都非常类似于index。这些action都是从基础的action继承而来,因此它们的实现非常相似。下图展示了indexaction的继承关系
这些action只是一个代替品,没有实现真正的功能,因此它们在实现上也非常容易。他们的主要功能是提供创建新的响应和请求的方法,并对应到相应的操作名称。还拿indexaction为例,它的方法图如下所示:
可以看到它只是提供了两个新建response和request的方法,及一个字NAME字段,这个NAME字段会用于后面action调用中。对应的功能实现在相应的transportAction中。
TransportAction接口被所有的tansportAction继承。客户端调用client的相关接口时,client会将请求发送到transportAction的execute上。每个功能的TransportAction实现了doExecute方法,功能的逻辑都在此方法中实现,这里先暂且不提,后面的功能分析中会看到对应的实现。
在client分析中有这样一段代码:
TransportActiona22772589952c63813d6930c8e5b1fe8 transportAction = actions.get((ClientAction)action)它的作用就是根据action获取TransportAction。因为action只是代理。The implementation of these associations is carried out in the ActionModule, as demonstrated in the following code:
registerAction(NodesInfoAction.INSTANCE, TransportNodesInfoAction.class); registerAction(NodesStatsAction.INSTANCE, TransportNodesStatsAction.class); registerAction(NodesShutdownAction.INSTANCE, TransportNodesShutdownAction.class); registerAction(NodesRestartAction.INSTANCE, TransportNodesRestartAction.class); registerAction(NodesHotThreadsAction.INSTANCE, TransportNodesHotThreadsAction.class); registerAction(ClusterStatsAction.INSTANCE, TransportClusterStatsAction.class); registerAction(ClusterStateAction.INSTANCE, TransportClusterStateAction.class); registerAction(ClusterHealthAction.INSTANCE, TransportClusterHealthAction.class)
只有一部分内容展示在这里,其中module会将相应的action和TransportAction绑定起来。这样在client需要收到请求时会根据对于的action实例来查找对应的tansportAction实例,最终请求在它们下面处理。
以上是elasticsearch java客户端action怎么实现的详细内容。更多信息请关注PHP中文网其他相关文章!