0

私の要件は、Spring Boot を使用して Java Rest クライアント API を介して ElasticsticSearch DB からデータを取得する必要があることです。そのため、以下のようにスプリング ブート コードを記述しました。

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());
                }
            }
        }

アプリケーションの起動時に上記のクライアントを開始し、アプリケーションがシャットダウンされるときにのみクライアントを閉じます。

次に、ELS からデータを取得するために (SerchResponse, multiserachResponse, CountResponse) を使用してそれぞれの API を作成しました。

データが少ないため、このコードは非 PROD 環境で正常に動作します。しかし、PROD 環境では膨大なデータがあるため、これらの API を呼び出すと、以下のエラーが発生しました。

2020-05-28T15:24:52.96+0530 [RTR/0] OUT 2020-05-28T15:24:53.72+0530 [APP/PROC/WEB/0] ERR スレッド「I/O ディスパッチャ 1」で例外が発生しました java. lang.OutOfMemoryError: Direct buffer memory 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] ERR at 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 ERROR 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