用法
编辑用法
编辑一旦 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();
此外,还可以为高级用例提供自定义的 NodesSniffer
实现,这些用例可能需要从外部源而不是从 Elasticsearch 获取节点。
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();