Я использую SliceBuilder для чтения данных изasticsearch.10 срезов, которые я создаю, и для каждого среза будет запущен один поток (используя вызываемый интерфейс).После выполнения потоков, получит количество обращений от каждого потока и суммирует их, чтобы получить результат.Мой вопрос заключается в том, как мне обработать исключение здесь.Как и для каждого потока, возникли разные исключения.например, для первого потока Ошибка отключения соединения, для второго потока.Другой вопрос: это хороший подход к использованию потока в этом сценарии?Сбой одного потока, тогда общее количество попаданий будет неправильным.в любом случае у нас снова запускается вся выборка.
Я делаю что-то вроде этого:
hitsExported =0;
ExecutorService executorService =
Executors.newFixedThreadPool(getSliceMax());
ExecutorCompletionService<Integer> executor = new
ExecutorCompletionService<>(executorService);
for (int sliceId = 0; sliceId < getSliceMax(); sliceId++) {
executor.submit(new SyncCallable(sliceId));
}
for (int i = 0; i < getSliceMax(); i++) {
hitsExported += executor.take().get();
}
Внутри класса SyncCallable (реализует вызываемый интерфейс) У меня есть фактическая упругая секция поиска внутри вызова THE() метод.
SearchRequestBuilder searchRequestBuilder =
client.prepareSearch("indices_names")
.setScroll(new TimeValue(scrollTimeout))
.setQuery(query)
.setSize(scrollSize)
.addSort(SortBuilders.fieldSort("_doc"));
searchRequestBuilder.slice(new SliceBuilder("field_name",sliceId,getSliceMax()));