
4.4 常见通用设置
除上述客户端API外,客户端还支持一些常见通用设置,如超时设置、线程数设置、节点选择器设置和配置嗅探器等。
1.超时设置
我们可以在构建RestClient时提供requestconfigCallback的实例来完成超时设置。该接口有一个方法,它接收org.apache.http.client.config.requestconfig.builder的实例作为参数,并且具有相同的返回类型。
用户可以修改请求配置生成器org.apache.http.client.config.requestconfig.builder的实例,然后返回。
在下面的示例中,增加了连接超时(默认为1s)和套接字超时(默认为30s),代码如下所示:

在具体使用时,详见MeetElasticSearchServiceImpl中的代码,部分代码如下所示:

2.线程数设置
Apache HTTP异步客户端默认启动一个调度程序线程,连接管理器使用的多个工作线程。一般线程数与本地检测到的处理器数量相同,线程数主要取决于Runtime.getRuntime().availableProcessors()返回的结果。
Elasticsearch允许用户修改线程数,修改代码如下所示,详见MeetElasticSearchServiceImpl类:

3.节点选择器设置
在默认情况下,客户端会以轮询的方式将每个请求发送到配置的各个节点中。
Elasticsearch允许用户自由选择需要连接的节点。一般通过初始化客户端来配置节点选择器,以便筛选节点。
该功能在启用嗅探器时很有用,以防止HTTP请求只命中专用的主节点。
配置后,对于每个请求,客户端都通过节点选择器来筛选备选节点。
代码如下所示,详见MeetElasticSearchServiceImpl类:

4.配置嗅探器
嗅探器允许自动发现运行中的Elasticsearch集群中的节点,并将其设置为现有的RestClient实例。
在默认情况下,嗅探器使用nodes info API检索属于集群的节点,并使用jackson解析获得的JSON响应。
目前,嗅探器与Elasticsearch 2.X及更高版本兼容。
在使用嗅探器之前需添加相关的依赖,代码如下所示:

在创建好RestClient实例(如初始化中代码所示)后,就可以将嗅探器与其进行关联了。嗅探器利用RestClient提供的定期机制(在默认情况下定期时间为5min),从集群中获取当前节点的列表,并通过调用RestClient类中的setNodes方法来更新它们。
嗅探器的使用代码详见ServiceImpl实现层的MeetElasticSearchServiceImpl类,部分代码如下所示:

当然,除在客户端启动时配置嗅探器外,还可以在失败时启用嗅探器。这意味着在每次失败后,节点列表都会立即更新,而不是在接下来的普通嗅探循环中更新。
在这种情况下,首先需要创建一个SniffOnFailureListener,然后在创建RestClient时配置。在创建嗅探器后,同一个SniffOnFailureListener实例会相互关联,以便在每次失败时都通知该实例,并使用嗅探器执行嗅探动作。
嗅探器SniffOnFailureListener的使用代码详见ServiceImpl实现层的MeetElasticSearchServiceImpl类,部分代码如下所示:

由于Elasticsearch节点信息API不会返回连接到节点时要使用的协议,而是只返回它们的host:port,因此在默认情况下会使用HTTP。如果需要使用HTTPS,则必须手动创建并提供ElasticSearchNodesNiffer实例,相关代码如下所示:
