0

我的要求是我需要使用 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)

任何人都可以遇到这样的问题,请让我知道如何解决这个问题。

4

0 回答 0