Usage
editUsage
editOnce a RestClient
instance has been created, a Sniffer
can be associated
to it. The Sniffer
will make use of the provided RestClient
to periodically
(every 5 minutes by default) fetch the list of current nodes from the cluster
and update them by calling RestClient#setHosts
.
Sniffer sniffer = Sniffer.builder(restClient).build();
It is important to close the Sniffer
so that its background thread gets
properly shutdown and all of its resources are released. The Sniffer
object should have the same lifecycle as the RestClient
and get closed
right before the client:
sniffer.close(); restClient.close();
The Elasticsearch Nodes Info api doesn’t return the protocol to use when
connecting to the nodes but only their host:port
key-pair, hence http
is used by default. In case https
should be used instead, the
ElasticsearchHostsSniffer
object has to be manually created and provided
as follows:
HostsSniffer hostsSniffer = new ElasticsearchHostsSniffer(restClient, ElasticsearchHostsSniffer.DEFAULT_SNIFF_REQUEST_TIMEOUT, ElasticsearchHostsSniffer.Scheme.HTTPS); Sniffer sniffer = Sniffer.builder(restClient) .setHostsSniffer(hostsSniffer).build();
In the same way it is also possible to customize the sniffRequestTimeout
,
which defaults to one second. That is the timeout
parameter provided as a
querystring parameter when calling the Nodes Info api, so that when the
timeout expires on the server side, a valid response is still returned
although it may contain only a subset of the nodes that are part of the
cluster, the ones that have responsed until then.
Also, a custom HostsSniffer
implementation can be provided for advanced
use-cases that may require fetching the hosts from external sources.
The Sniffer
updates the nodes by default every 5 minutes. This interval can
be customized by providing it (in milliseconds) as follows:
Sniffer sniffer = Sniffer.builder(restClient) .setSniffIntervalMillis(60000).build();
It is also possible to enable sniffing on failure, meaning that after each
failure the nodes list gets updated straightaway rather than at the following
ordinary sniffing round. In this case a SniffOnFailureListener
needs to
be created at first and provided at RestClient
creation. Also once the
Sniffer
is later created, it needs to be associated with that same
SniffOnFailureListener
instance, which will be notified at each failure
and use the Sniffer
to perform the additional sniffing round as described.
SniffOnFailureListener sniffOnFailureListener = new SniffOnFailureListener(); RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)) .setFailureListener(sniffOnFailureListener).build(); Sniffer sniffer = Sniffer.builder(restClient).build(); sniffOnFailureListener.setSniffer(sniffer);
When using sniffing on failure, not only do the nodes get updated after each
failure, but an additional sniffing round is also scheduled sooner than usual,
by default one minute after the failure, assuming that things will go back to
normal and we want to detect that as soon as possible. Said interval can be
customized at Sniffer
creation time as follows:
Sniffer sniffer = Sniffer.builder(restClient) .setSniffAfterFailureDelayMillis(30000).build();
Note that this last configuration parameter has no effect in case sniffing on failure is not enabled like explained above.