Java: конвейер параллельного потока -> iterator () с «подготовить элементы X» - PullRequest
0 голосов
/ 25 февраля 2019

Я хотел бы использовать API Java Streams для создания конвейера, а затем завершить его с помощью iterator(), но я хочу, чтобы он заранее "асинхронно" готовил X элементов.(API потоков не требуется, но предпочтительнее).

Ситуация, которую я имею:

  • Наше приложение загружает данные из удаленных файлов (по сети) в базу данных
    1. Открытие удаленного файла (то есть синхронное выполнение конвейера для одного элемента) занимает нетривиальное время
    2. Я не могу открыть слишком много файлов одновременно (приводит к таймауту соединения)
  • Порядок, в котором загружаются файлы, имеет значение

API-интерфейс Java Streams может создавать конвейер команд для выполнения, но, насколько мне известно, он не может удовлетворить оба вышеуказанных требования.Он может выполнять либо одно выполнение:

files.stream().map(this::convertToInputStream).iterator()

, что усугубляет первое требование.Или он может выполнять массовое выполнение:

files.stream().map(this::convertToInputStream).collect(toList())

, которое не дает второго.

Я реализовал требования, используя логику Deque<InputStream> и Thread, чтобы заполнить ее до определенного уровня.количество элементов, но это не красиво.Я спрашиваю, знает ли кто-нибудь о способе создания конвейеров, подобных этому (возможно, с использованием библиотек) более элегантным способом.Это казалось разумным вариантом использования Streams API.

...