用法
编辑用法
编辑一旦按照初始化中所示创建了 RestClient
实例,就可以将其与 Sniffer
关联。Sniffer
将使用提供的 RestClient
定期(默认每 5 分钟)从集群获取当前节点列表,并通过调用 RestClient#setNodes
来更新它们。
RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")) .build(); Sniffer sniffer = Sniffer.builder(restClient).build();
关闭 Sniffer
很重要,这样它的后台线程才能正确关闭,并且所有资源都被释放。Sniffer
对象应该与 RestClient
具有相同的生命周期,并在客户端关闭之前关闭。
sniffer.close(); restClient.close();
Sniffer
默认每 5 分钟更新一次节点。可以通过提供(以毫秒为单位)来定制此间隔,如下所示
RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")) .build(); Sniffer sniffer = Sniffer.builder(restClient) .setSniffIntervalMillis(60000).build();
也可以在失败时启用嗅探,这意味着每次失败后,节点列表会立即更新,而不是在下一个普通的嗅探轮次中更新。在这种情况下,首先需要创建一个 SniffOnFailureListener
,并在创建 RestClient
时提供。此外,一旦稍后创建了 Sniffer
,它需要与同一个 SniffOnFailureListener
实例关联,该实例将在每次失败时收到通知,并使用 Sniffer
执行如上所述的额外嗅探轮次。
SniffOnFailureListener sniffOnFailureListener = new SniffOnFailureListener(); RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200)) .setFailureListener(sniffOnFailureListener) .build(); Sniffer sniffer = Sniffer.builder(restClient) .setSniffAfterFailureDelayMillis(30000) .build(); sniffOnFailureListener.setSniffer(sniffer);
将失败监听器设置为 |
|
在失败时嗅探时,不仅在每次失败后都会更新节点,还会比平时更快地安排额外的嗅探轮次,默认是在失败后一分钟,假设事情会恢复正常,我们希望尽快检测到这一点。可以在 |
|
将 |
Elasticsearch 节点信息 API 不会返回连接到节点时要使用的协议,而只会返回它们的 host:port
键值对,因此默认使用 http
。如果应该改用 https
,则必须手动创建 ElasticsearchNodesSniffer
实例并按如下方式提供:
RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")) .build(); NodesSniffer nodesSniffer = new ElasticsearchNodesSniffer( restClient, ElasticsearchNodesSniffer.DEFAULT_SNIFF_REQUEST_TIMEOUT, ElasticsearchNodesSniffer.Scheme.HTTPS); Sniffer sniffer = Sniffer.builder(restClient) .setNodesSniffer(nodesSniffer).build();
同样,也可以自定义 sniffRequestTimeout
,默认为一秒。这是调用节点信息 API 时作为查询字符串参数提供的 timeout
参数,这样当服务器端超时时,仍然会返回一个有效的响应,尽管它可能只包含集群中节点的一个子集,即那些到目前为止已响应的节点。
RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")) .build(); NodesSniffer nodesSniffer = new ElasticsearchNodesSniffer( restClient, TimeUnit.SECONDS.toMillis(5), ElasticsearchNodesSniffer.Scheme.HTTP); Sniffer sniffer = Sniffer.builder(restClient) .setNodesSniffer(nodesSniffer).build();
此外,还可以为可能需要从外部源而不是从 Elasticsearch 获取节点的高级用例提供自定义的 NodesSniffer
实现。
RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")) .build(); NodesSniffer nodesSniffer = new NodesSniffer() { @Override public List<Node> sniff() throws IOException { return null; } }; Sniffer sniffer = Sniffer.builder(restClient) .setNodesSniffer(nodesSniffer).build();