2017-01-07 9 views
0

Я использую Elasticsearch's bulk requests в Java, и я пытаюсь справиться с ситуациями, когда какая-то ошибка происходит:Как получить от BulkItemResponse на соответствующий запрос

BulkResponse bulkResponse = bulkRequest.get(); 
if (bulkResponse.hasFailures()) { 
    for (BulkItemResponse response : bulkResponse) { 
     if (response.isFailed() 
     || response.getResponse().getShardInfo().getFailed() > 0) { 
      //Find the corresponding request and resend it 
     } 
    } 
} 

После нахождения ответа с ошибкой, я хочу повторно отправить запрос, поскольку в моем случае ошибки могут быть кратковременными, и в большинстве случаев повторная попытка может решить проблему.

Так что мой вопрос: как добраться от BulkItemResponse до исходного Request, который привел его? Есть ли способ лучше, чем полагаться на порядок запросов и ответов?

ответ

0

Нет, у вас нет этого AFAIK. Вам нужно каким-то образом сохранить все элементы, добавленные вами в массив, а в случае ошибки используйте идентификатор, исходящий от response.getId(), чтобы связать это с исходными данными.

Так что-то подобное:

HashMap<String, Object> myData = new HashMap<>(); 

BulkRequestBuilder brb = BulkAction.INSTANCE.newRequestBuilder(client); 

myData.put(myObject.getId(), myObject); 
brb.add(new IndexRequest("index", "type", myObject.getId()).source(myObject.toJson())); 

// Other actions 
BulkResponse response = client.bulk(brb.request()).get(); 
response.forEach(bulkItemResponse -> { 
    if (bulkItemResponse.isFailed()) { 
     Object objectToSendAgain = myData.get(bulkItemResponse.getId()); 
     // Do what is needed with this object 
    } 
}); 

myData = null; 

Я надеюсь, что это помогает.

+0

Я думаю, вы считаете, что в каждом 'BulkRequestBuilder'' myObject.getId() 'уникален, но это не обязательно так. У меня может быть одна вставка и одно обновление/удаление в одном массовом запросе для того же документа. – Mehran

+0

Обновить карту в этом случае. – dadoonet

+0

Извините, но я не уверен, что вы имеете в виду! Рассмотрим сценарий, в котором в одном и том же объеме два запроса имеют один и тот же идентификатор, а один из них не работает. Как ваше решение справляется с этой ситуацией? Я полагаю, что полагаться на id никогда не будет. – Mehran

 Смежные вопросы

  • Нет связанных вопросов^_^