Завершение работы клиента Jest после первой операции выполнения

Я создал пакет AWS Lambda (Java) с функцией, которая считывает некоторые файлы из Amazon S3 и отправляет данные в сервис AWS ElasticSearch. Поскольку я использую AWS Elastic Search, я не могу использовать транспортный клиент, и в этом случае я работаю с Jest Client для отправки через REST. Проблема с клиентом Jest.

Вот мой экземпляр клиента Jest:

public JestClient getClient() throws InterruptedException{
    final Supplier<LocalDateTime> clock = () -> LocalDateTime.now(ZoneOffset.UTC);

    DefaultAWSCredentialsProviderChain awsCredentialsProvider = new DefaultAWSCredentialsProviderChain();

    final AWSSigner awsSigner = new AWSSigner(awsCredentialsProvider, REGION, SERVICE, clock);

    JestClientFactory factory = new JestClientFactory() {
        @Override
        protected HttpClientBuilder configureHttpClient(HttpClientBuilder builder) {
            builder.addInterceptorLast(new AWSSigningRequestInterceptor(awsSigner));
            return builder;
        }

        @Override
        protected HttpAsyncClientBuilder configureHttpClient(HttpAsyncClientBuilder builder) {
            builder.addInterceptorLast(new AWSSigningRequestInterceptor(awsSigner));
            return builder;
        }
    };

    factory.setHttpClientConfig(
            new HttpClientConfig.Builder(URL)
                    .discoveryEnabled(true)
                    .multiThreaded(true).build());

    JestClient jestClient = factory.getObject();
    return jestClient;
}

Поскольку домен AWS Elasticsearch защищен политикой доступа IAM, я подписываю запросы на их авторизацию AWS (пример здесь). Я использую POJO для индексации документов.

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу выполнить более одного действия с экземпляром клиента jest. Например, если я сначала создал индекс:

client.execute(new CreateIndex.Builder(indexName).build()); 

а позже я хотел, например, выполнить массовое индексирование:

for (Object object : listOfObjects) {
    bulkIndexBuilder.addAction(new Index.Builder(object ).
                      index(INDEX_NAME).type(DOC_TYPE).build());
        }
client.execute(bulkIndexBuilder.build());

будет выполнено только первое действие, а второе не удастся. Это почему? Можно ли выполнить более одного действия?

Более того, используя предоставленный код, я не могу выполнить более 20 массовых операций, когда хочу проиндексировать документ. В принципе, около 20 — это нормально, но если больше, то client.execute(bulkIndexBuilder.build()); просто не запустится, и клиент выключится.

Любая помощь или предложение будут оценены.

ОБНОВЛЕНИЕ: кажется, что AWS ElasticSearch не позволяет подключаться к отдельным узлам. Простое отключение обнаружения узлов в клиенте Jest .discoveryEnabled(false) решило все проблемы. Этот ответ помог.


person choka    schedule 14.12.2016    source источник