基于 springframework.data.elasticsearch 创建
3.3.1版本包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>3.3.1</version>
</dependency>
@Configuration
public class ElasticRestClientConfig extends ElasticsearchConfiguration {
private static final Logger LOGGER = LoggerFactory.getLogger(ElasticRestClientConfig.class);
@Value("${spring.elasticsearch.rest.uris}")
private String[] urls;
@Override
public ClientConfiguration clientConfiguration() {
ClientConfiguration.ClientConfigurationCallback<RestClientBuilder> clientConfigurer = clientBuilder -> {
return clientBuilder.setHttpClientConfigCallback(httpClientBuilder -> {
httpClientBuilder.setKeepAliveStrategy((response, context) -> 10 * 60 * 1000);
return httpClientBuilder;
});
};
return ClientConfiguration.builder()
.connectedTo(urls)
.withClientConfigurer(clientConfigurer)
.withConnectTimeout(Duration.ofSeconds(10)) // 设置连接超时
.withSocketTimeout(Duration.ofSeconds(30)) // 设置读取数据的超时
.build();
}
@Bean
public ElasticsearchAsyncClient elasticsearchAsyncClient(ElasticsearchTransport transport) {
return new ElasticsearchAsyncClient(transport);
}
}
连接超时时间好像 这样设置没有什么用
还是会因为 linux 的连接超时而发生断线
只能重写 RestClient
@Bean
@Override
public RestClient elasticsearchRestClient(ClientConfiguration clientConfiguration) {
List<HttpHost> httpHosts = new ArrayList<>();
for (String url : urls) {
String[] split = url.split(":", 2);
httpHosts.add(new HttpHost(split[0], Integer.parseInt(split[1]), "http"));
}
return RestClient.builder(httpHosts.toArray(new HttpHost[0]))
// http 连接保持10分钟
.setHttpClientConfigCallback(requestConfig -> requestConfig.setKeepAliveStrategy(
(response, context) -> 10 * 60 * 1000))
.setRequestConfigCallback(requestConfigBuilder ->
requestConfigBuilder.setConnectTimeout(10000).setSocketTimeout(30000))
.build();
}