我在Java中使用Elasticsearch's bulk requests,我试图处理发生错误的情况:
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 :(得分:0)
不,你没有那个AFAIK。您需要以某种方式将所有添加的元素保留为批量,如果出现错误,请使用来自response.getId()
的ID将其与原始数据相关联。
类似于:
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;
我希望这会有所帮助。