Как обрабатывать исключения при использовании Elasticsearch SliceBuilder Java API, используя многопоточный исполнитель и вызываемый интерфейс - PullRequest
0 голосов
/ 12 декабря 2018

Я использую 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()));
...