У меня есть Java-клиент, который должен рекурсивно вызывать сервер для извлечения большого графа данных - для этого требуется примерно тысяча вызовов. У меня нет контроля над сервером, и это требуется для критического сценария восстановления после сбоя.
Моя проблема в том, что мне нужно заблокировать исходную ветку до завершения всех вызовов.
Абстракции RecursiveAction и ForkJoinPool из java.util.concurrent - это именно то, что мне нужно, за исключением того, что они предназначены для параллелизма ЦП и запрещают использование блокирующего ввода-вывода.
Итак, как лучше всего реализовать рекурсивные сетевые вызовы с блокировкой инициирующего потока до завершения всех вызовов?
Дополнительная контекстная информация:
- Я не могу изменить сервер.
- Сервер разрешает и поддерживает этот тип сложных запросов.
- Я ограничу количество одновременных сетевых вызовов примерно 10-30.
- Кэширование данных на диске невозможно.
Дополнительные соображения: будет ли подходящим однофазный фазер в сочетании с ThreadPoolExecutor? Задачи вызова будут вызывать Phaser.register (), выполнять вызов, отправлять дочерние задачи, а затем вызывать Phaser.arrive (). Инициирующий поток будет вызывать Phaser.awaitAdvance (1). Это был бы самый подходящий подход?