java - Elasticsearch REST 客户端 MultiGet——GetResult 始终为空
问题描述
我正在构建一个MultiGetRequest
来验证 Elasticsearch 中是否存在记录。
这是我的方法:
@Scheduled(cron = "${es.doSomething}")
public List<Record> doSomething() {
MultiGetRequest multiExistRequest = new MultiGetRequest();
someService.findAll().forEach(record -> {
String id = record.get("id").asText();
multiExistRequest.add(new MultiGetRequest.Item("_all", "type", id)
.fetchSourceContext(FetchSourceContext.FETCH_SOURCE)
.storedFields("_none_"));
});
BulkRequest bulkDeleteRequest = new BulkRequest();
final CountDownLatch existLatch = new CountDownLatch(multiExistRequest.getItems().size());
ActionListener<MultiGetResponse> existListener = new ActionListener<MultiGetResponse>() {
@Override
public void onResponse(MultiGetResponse responses) {
responses.forEach(response -> {
assert response.getFailure() == null;
GetResponse getResponse = response.getResponse();
if (getResponse.isExists()) {
bulkDeleteRequest.add(new DeleteRequest(response.getIndex(), response.getType(), response.getId()));
}
existLatch.countDown();
});
}
@Override
public void onFailure(Exception e) {
// TODO -- add retry logic
LOGGER.error(e.getMessage(), e);
existLatch.countDown();
}
};
client.multiGetAsync(multiExistRequest, existListener);
try {
existLatch.await();
} catch (InterruptedException e) {
LOGGER.error("Latch was interrupted", e);
}
// Do more stuff...
}
不幸的是,getResponse.isExists()
抛出 aNullPointerException
并且底层GetResult
为空。为什么会这样?看起来请求成功并返回 200:
java.io.IOException: Unable to parse response body for Response{requestLine=POST /_mget HTTP/1.1, host=http://elasticsearch:9200, response=HTTP/1.1 200 OK}
at org.elasticsearch.client.RestHighLevelClient$1.onSuccess(RestHighLevelClient.java:582) ~[elasticsearch-rest-high-level-client-6.3.2.jar!/:6.3.2]
at org.elasticsearch.client.RestClient$FailureTrackingResponseListener.onSuccess(RestClient.java:621) [elasticsearch-rest-client-6.3.2.jar!/:6.3.2]
at org.elasticsearch.client.RestClient$1.completed(RestClient.java:375) [elasticsearch-rest-client-6.3.2.jar!/:6.3.2]
at org.elasticsearch.client.RestClient$1.completed(RestClient.java:366) [elasticsearch-rest-client-6.3.2.jar!/:6.3.2]
at org.apache.http.concurrent.BasicFuture.completed(BasicFuture.java:123) [httpcore-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.responseCompleted(DefaultClientExchangeHandlerImpl.java:181) [httpasyncclient-4.1.4.jar!/:4.1.4]
at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.processResponse(HttpAsyncRequestExecutor.java:442) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.inputReady(HttpAsyncRequestExecutor.java:332) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:265) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81) [httpasyncclient-4.1.4.jar!/:4.1.4]
at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39) [httpasyncclient-4.1.4.jar!/:4.1.4]
at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104) [httpcore-nio-4.4.10.jar!/:4.4.10]
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:588) [httpcore-nio-4.4.10.jar!/:4.4.10]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_181]
Caused by: java.lang.NullPointerException: null
at some.random.package.elasticsearch.ElasticsearchService$1.lambda$onResponse$0(ElasticsearchService.java:81) ~[classes!/:na]
at java.lang.Iterable.forEach(Iterable.java:75) ~[na:1.8.0_181]
at some.random.package.elasticsearch.ElasticsearchService$1.onResponse(ElasticsearchService.java:78) ~[classes!/:na]
at some.random.package.elasticsearch.ElasticsearchService$1.onResponse(ElasticsearchService.java:75) ~[classes!/:na]
at org.elasticsearch.client.RestHighLevelClient$1.onSuccess(RestHighLevelClient.java:580) ~[elasticsearch-rest-high-level-client-6.3.2.jar!/:6.3.2]
... 18 common frames omitted
我正在使用 Elasticsearch 高级 REST 客户端 6.3.2。