Es 超时设置 high-level-client
照例,先上解决方案。我用的是es的high-level-client,不是spring-boot-starter-data-elasticsearch。
1、解决办法
1.1、自定义的RestHighLevelClient
在config配置类中,创建high-level-client时添加socket-timeout设置RequestConfigCallback。相关原理分析
@Configuration
public class ElasticRestJavaClientConfig {
@Value("${elasticsearch.host}")
private String hostList;
@Bean
public RestHighLevelClient restHighLevelClient() {
//解析hostlist配置信息
String[] split = hostList.split(",");
//创建HttpHost数组,其中存放es主机和端口的配置信息
HttpHost[] httpHostArray = new HttpHost[split.length];
for (int i = 0; i < split.length; i++) {
String item = split[i];
httpHostArray[i] = new HttpHost(item.split(":")[0],
Integer.parseInt(item.split(":")[1]), "http");
}
//核心,配置超时时间,添加configCallback,之后创建连接时会将超时设置到socket上
RestClientBuilder.RequestConfigCallback requestConfigCallback = requestConfigBuilder -> requestConfigBuilder.setSocketTimeout(28_800_000);
RestClientBuilder builder = RestClient.builder(httpHostArray).setRequestConfigCallback(requestConfigCallback);
//创建RestHighLevelClient客户端
return new RestHighLevelClient(builder);
}
}
1.2、spring 装配的RestHighLevelClient
有两种方式,配置文件和自定义bean。相关原理spring 自动装配
1.2.1、配置文件
yml配置
spring:
elasticsearch:
rest:
#单位毫秒
read-timeout: 30
connection-timeout: 30
uris: ["http://localhost:9200","http://localhost:9201","http://localhost:9202"]
1.2.2 自定义bean
创建bean,并实现RestClientBuilderCustomizer即可
/**
* 成为spring的bean
*/
@Component
public class MyRestClientBuilderCustomizer implements RestClientBuilderCustomizer {
@Override
public void customize(RestClientBuilder builder) {
//配置超时
RestClientBuilder.RequestConfigCallback configCallback = requestConfigBuilder -> requestConfigBuilder.setSocketTimeout(1000);
//设置配置
builder.setRequestConfigCallback(configCallback);
}
}
2、分析-针对自定义的RestHighLevelClient
2.1、问题背景
我们的es集群需要定时做reindex操作,大概需要30分钟。在测试期间总是发现出现超时,抛出如下异常