ElasticSearch为什么在客户端或节点上调用close()?

时间:2014-04-30 08:44:08

标签: java elasticsearch

您是否有理由在客户端或节点上调用close()?如果你不这样做有什么影响?

Node node = nodeBuilder().client(true).node();
Client client = node.client();
// index some stuff
client.close(); // <-- why do this ?
node.close(); // <-- why do this ?

我们有一个客户端,其生命周期与我们的应用程序相匹配。我想知道我们是否需要在申请拆除时打扰client.close()node.close()

2 个答案:

答案 0 :(得分:3)

请考虑以下代码段:

// on startup

Node node = nodeBuilder().node();
Client client = node.client();

// on shutdown

node.close();

根据the documentation,当您创建Node时,它会加入本地弹性搜索群集。这意味着向群集中的其他节点宣布自己...并且可能开始侦听来自其他节点或客户端的请求。

当您的应用程序退出并且JVM终止时,该节点显然无法再处理来自其他节点的请求。

  • 如果您的应用程序如上所述调用node.close(),该节点将告诉其他节点它正在消失,以便其他节点知道不再发送任何请求。

  • 如果您的应用程序调用node.close(),则其他节点将不知道此节点已消失,并可能继续向其发送请求。这些请求将失败,可能导致异常,日志消息等。至少,向无法响应的节点发送请求是浪费时间/资源。

显然,如果您的应用程序是群集中的唯一节点,那么这是没有意义的。但是,做出这个假设是一个坏主意,并且可能值得在(至少)当前应用程序的close()对象上调用Node的小开销。 / p>

答案 1 :(得分:2)

如果您可以为整个应用程序共享相同的客户端实例,那肯定会更好。

因此,每次需要时都不要打开新节点和新客户端。分享(使用工厂)。

当您停止应用程序(或JVM)时,最好关闭节点,而不是让其他节点将该信息作为例外。

不确定我回答了你的问题!