У меня есть сервис, живущий на сервере 1. Давайте назовем его PDFService
.PDFService
берет документы и объединяет их в один PDF.
Однако PDFService
знает только об идентификаторах документов.Для получения фактического содержимого документов используется сервер 2.
В начале процесса PDFService
он будет собирать идентификаторы документов в пакетном режиме.Когда у него есть пакет, он отправляет асинхронный запрос для каждого идентификатора в пакете в очередь на сервере 2 (возвращая 204).Затем он продолжит собирать больше партий и повторить.
Как только все партии будут собраны и отправлены, PDFService
начнет процесс сшивания.
Тем временем, ни один, некоторые,или все документы, возможно, были обработаны сервером 2 и возвращены на сервер 1. Сервер 2 может вернуть документы в том порядке, в котором он их получил. (Каждый документ будет компилироваться и возвращаться в разное время).
Сервер 1 должен прошивать их в том же порядке, в котором они были отправлены.Итак, он должен дождаться документа 1, прошить его, дождаться документа 2, прошить его и т. Д.
На данный момент у меня есть класс DocumentManager
, который будет хранить все идентификаторы документов в Map
с null
значениями.Когда завершенный документ возвращается с Сервера 2, Map
обновляется фактическим значением (объект, содержащий содержимое документа).Это, очевидно, неправильно, так как тогда PDFService
придется использовать while null
+ sleep
, что плохо.
Мой вопрос: как я могу позволить PDFService "ждать" для каждого документа, если это нужно? Добавление CompletableFuture
объектов к моему Map
кажется многообещающим, но я не могу понять, как его использовать или это даже правильный подход.
(Это один из моих первых вопросов, просьба дать конструктивный отзыв!)