Как я могу позволить службе ждать завершения внешнего процесса? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть сервис, живущий на сервере 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 кажется многообещающим, но я не могу понять, как его использовать или это даже правильный подход.

(Это один из моих первых вопросов, просьба дать конструктивный отзыв!)

1 Ответ

0 голосов
/ 12 октября 2018

Хм ... Я могу порекомендовать вам взглянуть на некоторые фреймворки Enterprise Integration, такие как "Spring Integration", "Apache Camel", "MuleSoft" и некоторые другие.Такая структура может позаботиться обо всех ожидающих, асинхронных, параллельных, агрегационных и т. Д. Вещах, и вам будет намного проще.

в целом

она отправит асинхронный запрос длякаждый идентификатор в пакете очереди на сервере 2

Вы уже упомянули очередь, поэтому одним из возможных решений является использование очереди JMS.

  • Сервер1 отправляет documentId для Сервера2 в очередь JMS
  • Сервер2 прослушивает очередь и отвечает фактическим документом (существует множество возможностей ответа сервера на сообщение JMS)
  • Сервер1прислушивается к ответу, а затем сшивает их все, когда все получено

Но с EIP-платформой JMS предоставляет не только одну возможность - в качестве примера для пакета это могут быть синхронные, но параллельные вызовы Server2 ...

Кстати: создавать такие вещи с нуля без каких-либо фреймворков (EIP и / или JMS) очень больно и не имеет смысла это делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...