您是否有理由在客户端或节点上调用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()
?
答案 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)时,最好关闭节点,而不是让其他节点将该信息作为例外。
不确定我回答了你的问题!