使用
编辑使用编辑
一旦创建了 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();