我的要求是我需要使用 Spring Boot 通过 Java Rest 客户端 API 从 ElasticsticSearch DB 获取数据。所以我写了如下的spring boot代码。
pom.xml 中的依赖:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.7.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.7.0</version>
</dependency>
and Client class as below:
private RestHighLevelClient buildClient() {
if (restHighLevelClient == null) {
synchronized (this) {
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(username, password));
try {
HttpClientConfigCallback httpClientConfigCallback = null;
httpClientConfigCallback = new HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(
HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder
.setDefaultCredentialsProvider(
credentialsProvider);
}
};
restHighLevelClient = new RestHighLevelClient(
RestClient.builder(
new HttpHost(elasticSearchHost, port,
scheme),
new HttpHost(elasticSearchHost2,
port2, scheme))
.setHttpClientConfigCallback(
httpClientConfigCallback));
} catch (Exception e) {
logger.error("RestHighLevel client create field. Exception: {}",
e.getMessage());
}
}
}
我们在应用程序启动期间启动上述客户端,并仅在应用程序关闭时关闭它。
然后我使用(SerchResponse, multiserachResponse, CountResponse) 编写了相应的 API 来从 ELS 中获取数据。
由于数据较少,此代码在非 PROD 环境中运行良好。但是在 PROD 环境中,我们有大量数据,所以当我们调用这些 API 时,我们遇到了错误。
2020-05-28T15:24:52.96+0530 [RTR/0] OUT 2020-05-28T15:24:53.72+0530 [APP/PROC/WEB/0] 线程“I/O 调度程序 1”java 中的 ERR 异常。 lang.OutOfMemoryError:直接缓冲内存 2020-05-28T15:24:53.72+0530 [APP/PROC/WEB/0] ERR at java.nio.Bits.reserveMemory(Bits.java:694) 2020-05-28T15:24 :53.72+0530 [APP/PROC/WEB/0] java.nio.DirectByteBuffer.(DirectByteBuffer.java:123) 的错误 2020-05-28T13:37:03.99+0530 [RTR/4] OUT 2020-05-28T13 :37:04.25+0530 [APP/PROC/WEB/0] OUT 2020-05-28 08:07:04.256 错误 14 --- [io-8080-exec-10] cddeElasticSearchRepositoryImpl : 异常 :: java.lang.IllegalStateException : 请求无法执行;I/O 反应器状态: STOPPED 2020-05-28T13:37:04.25+0530 [APP/PROC/WEB/0] OUT at org.apache.http.util.Asserts.check(Asserts.java:46)
任何人都可以遇到这样的问题,请让我知道如何解决这个问题。