2016-03-01 4 views
1

Я читал эту страницу о том, как использовать в Spring Асинхронный вызовы: https://spring.io/guides/gs/async-method/Использование Future <Entity> и асинхронной аннотаций весны

Это связано несколько проектных вопросов:

1) Есть ли у вас скрывать Асинхронные возможности позади абстракций, или вы используете их напрямую?

2) В приведенном выше примере ссылки на код был «while loop», проверяющий каждые 10 мс, если каждый вызов Async был возвращен. Существуют ли другие способы реализации этого, затем непрерывный цикл while? :) Не чувствует себя очень эффективно ...

Спасибо!

ответ

0

Ответ на вопрос № 2: Интерфейс Java Future имеет только два метода: get(), который блокирует асинхронный запрос до его завершения и isDone(), который проверяет, готовы ли результаты для отображения. К несчастью, между ними нет моста - вы не можете получить событие или другой триггер, сообщающий вам, что эта задача была рассчитана.

Java 8 представила механизм под названием CompletableFuture.

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html

От Документов:

будущего, которое может быть явно завершено (установив его значение и статуса), и может быть использована в качестве CompletionStage, поддерживая зависимые функций и действия, которые вызывают после его завершения.

Дополнительной учебник здесь: http://www.nurkiewicz.com/2013/05/java-8-definitive-guide-to.html

0

1) По моему опыту, асинхронные возможности непосредственно используются. Клиенты должны знать, что ответ не сразу доступен, поэтому они могут использовать API для ожидания. Это приводит к ...

2) Опрос. Нет, это не эффективно; но это общий подход к обработке асинхронной связи. Другим подходом был бы механизм обратного вызова или событий, но я не видел этого, реализованного в API-интерфейсе ReST.

  • Обратите внимание, что HTTP предназначен для поддержки опроса. В случае асинхронной операции сервер возвращает 202 (Accepted). Тело ответа 202 может содержать ссылку на другую конечную точку, которая может быть опрошена для обновлений статуса. Конечная точка проверки состояния вернет 303, когда завершена асинхронная обработка (или 404 тем временем).
+0

Прошу прощения, я был немного неясен. Таким образом, Клиент вызывает услугу. Компонент бизнес-логики службы выполняет несколько вызовов для бэкэнд-систем, асинхронно параллельно. Вот почему мне интересно, должен ли я иметь цикл, который проверяет, что все асинхронные вызовы вернулись, прежде чем вернуться к вызывающему клиенту. – user1340582

+0

Похоже, вы можете искать [ExecutorService] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html). – jaco0646