1、引入pom.xml依赖
<!--引入elasticsearch依赖-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.6.1</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.6.1</version>
</dependency>
2、Elasticsearch配置类
package com.hdy.manage.configuration;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Header;
import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.message.BasicHeader;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
/**
* elasticsearch配置
*/
@Configuration
public class ElasticsearchConfiguration {
@Value("${spring.data.elasticsearch.endpoints}")
private String elasticsearchEndpoints;
@Value("${spring.data.elasticsearch.connection-timeout}")
private Integer connectTimeout;
@Value("${spring.data.elasticsearch.socket-timeout}")
private Integer socketTimeout;
@Value("${spring.data.elasticsearch.connection-request-timeout}")
private Integer connectionRequestTimeout;
@Value("${spring.data.elasticsearch.max-conn-total}")
private Integer maxConnTotal;
@Value("${spring.data.elasticsearch.max-conn-per-route}")
private Integer maxConnPerRoute;
/**
* 不要调用close方法进行关闭
* @return
* @throws Exception
*/
@Bean
public RestHighLevelClient restHighLevelClient() throws Exception {
if (StringUtils.isBlank(elasticsearchEndpoints)) {
throw new Exception("elasticsearch 节点信息获取失败,请在配置文件中配置");
}
List<HttpHost> hostList = new ArrayList<>();
String[] endpoints = elasticsearchEndpoints.split(",");
for (String endpoint : endpoints) {
String[] endpointSpit = endpoint.split(":");
hostList.add(new HttpHost(endpointSpit[0], Integer.parseInt(endpointSpit[1])));
}
RestClientBuilder restClientBuilder = RestClient.builder(hostList.toArray(new HttpHost[0]));
// timeout=5, max=100
restClientBuilder.setDefaultHeaders(new Header[]{new BasicHeader("Keep-Alive", "timeout=1800, max=1000")});
// 异步httpclient连接延时配置
restClientBuilder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
@Override
public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
requestConfigBuilder.setConnectTimeout(connectTimeout);
requestConfigBuilder.setSocketTimeout(socketTimeout);
requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeout);
return requestConfigBuilder;
}
});
// 异步httpclient连接数配置
restClientBuilder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
httpClientBuilder.setMaxConnTotal(maxConnTotal);
httpClientBuilder.setMaxConnPerRoute(maxConnPerRoute);
return httpClientBuilder;
}
});
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(restClientBuilder);
return restHighLevelClient;
}
}
- Elasticsearch客户端与服务器进行交互使用长连接,需要在header中设置Keep-Alive的timeout时间
- Elasticsearch服务器端长连接长时间不使用会自动断开,但是客户端无感,所以可能会造成客户端下次请求客户端连接报错,因此需要设置Keep-Alive的timeout
3、application.properties文件
# 设置elasticsearch配置
spring.data.elasticsearch.endpoints=host:port,host:port,host:port
# 针对一个域名同时间正在使用的最多的连接数,默认值为 5
spring.data.elasticsearch.max-conn-per-route=20
# 同时间正在使用的最多的连接数,默认值为 2 * 5
spring.data.elasticsearch.max-conn-total=20
# 客户端和服务器建立连接超时时间
spring.data.elasticsearch.connection-timeout=10000
# 从服务器端到客户端传输数据超时时间
spring.data.elasticsearch.socket-timeout=30000
# 从连接池中获取连接超时时间
spring.data.elasticsearch.connection-request-timeout=500