使用编辑

一旦创建了 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); 

将失败监听器设置为 RestClient 实例

在失败时嗅探时,不仅节点会在每次失败后更新,而且还会在比平时更早的时间安排额外的嗅探轮次,默认情况下在失败后一分钟,假设情况会恢复正常,我们希望尽快检测到这一点。 所述间隔可以在 Sniffer 创建时通过 setSniffAfterFailureDelayMillis 方法进行自定义。 请注意,如果未启用失败时的嗅探,如上所述,则此最后一个配置参数无效。

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();

从外部来源获取主机