Я пытаюсь использовать ElasticSearch REST API с Java Apache HttpAsyncClient
. Я хочу использовать постоянное конвейерное соединение. Вот некоторый тестовый код (выход в комментариях):ElasticSearch и Apache HttpAsyncClient
@Test
public void testEsPipeliningClient() throws IOException, ExecutionException, InterruptedException
{
testPost(HttpAsyncClients.createDefault());
//201: {"_index":"test_index","_type":"test_type","_id":"AVIHYGnqdqqg_TAHm4ix","_version":1,"_shards":{"total":2,"successful":1,"failed":0},"created":true}
testPost(HttpAsyncClients.createPipelining());
//400: No handler found for uri [http://127.0.0.1:9200/test_index/test_type] and method [POST]
}
private void testPost(CloseableHttpAsyncClient client) throws ExecutionException, InterruptedException, IOException
{
client.start();
HttpPost request = new HttpPost("http://127.0.0.1:9200/test_index/test_type");
request.setEntity(new StringEntity("{\"some_field\": \"some_value\"}"));
Future<HttpResponse> responseFuture = client.execute(request, null);
HttpResponse response = responseFuture.get();
System.err.println(response.getStatusLine().getStatusCode() + ": " + EntityUtils.toString(response.getEntity()));
}
Я не могу понять, почему он прекрасно работает с HttpAsyncClients.createDefault()
клиентом, но не работает с HttpAsyncClients.createPipelining()
. Также я не могу понять разницу между этими двумя методами создания.
Почему я получаю сообщение об ошибке при использовании createPipelining()
?
Я попытался увидеть разницу с https://httpbin.org/post, но он показал мне тот же результат с обоими параметрами. Я использую настройки ElasticSearch по умолчанию.
Спасибо!
UPD1
Я попытался с PUT
документа (PUT http://127.0.0.1/test_index/test_type/<doc id>
) запроса с тем же результатом - он прекрасно работает с createDefault()
, но я получил подобную ошибку, когда делают это с createPipelining()
- обработчик не был найден <. ..>.
Но когда я пытаюсь выполнить запрос на создание индекса (PUT http://127.0.0.1/<index name>
), есть еще одна ошибка. Смотрите код ниже:
@Test
public void testEsPipeliningClient() throws IOException, ExecutionException, InterruptedException
{
testCreateIndex(HttpAsyncClients.createDefault());
//200: {"acknowledged":true}
testCreateIndex(HttpAsyncClients.createPipelining());
//400: {"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"failed to parse, document is empty"}],"type":"mapper_parsing_exception","reason":"failed to parse, document is empty"},"status":400}
}
private void testCreateIndex(CloseableHttpAsyncClient client) throws ExecutionException, InterruptedException, IOException
{
client.start();
HttpPut request = new HttpPut("http://127.0.0.1:9200/" + RandomStringUtils.randomAlphabetic(8).toLowerCase());
Future<HttpResponse> responseFuture = client.execute(request, null);
HttpResponse response = responseFuture.get();
System.err.println(response.getStatusLine().getStatusCode() + ": " + EntityUtils.toString(response.getEntity()));
}
Как я могу видеть на this documentation page ElasticSearch поддерживает HTTP конвейерный по умолчанию. Может быть, мне нужно изменить настройки ES?
UPD2
Вот некоторые провода журналы для кода в UPD1 раздел с различными параметрами записи:
Dorg.apache.commons.logging.simplelog.log.org.apache.http=DEBUG -Dorg.apache.commons.logging.simplelog.log.org.apache.http.wire=INFO
-Dorg.apache.commons.logging.simplelog.log.org.apache.http.impl.conn=DEBUG -Dorg.apache.commons.logging.simplelog.log.org.apache.http.impl.client=DEBUG -Dorg.apache.commons.logging.simplelog.log.org.apache.http.client=DEBUG -Dorg.apache.commons.logging.simplelog.log.org.apache.http.wire=DEBUG
UPD3
Я просто попытался заменить createDefault() с createMinimal(), и это вызвало ту же ошибку, что createPipelining(). Любые идеи, что в MinimalHttpAsyncClient могут вызвать эту проблему? Может быть, есть способ, которым я могу вручную создать конвейерный клиент (с классами строителей) без этой проблемы?
Какую версию ES вы используете? – Val
последний на сегодня, 2.1.1 – coolguy
Просьба отправить проводные журналы обеих сессий – oleg