Мы запустим новое приложение Spring 4 через несколько недель. И мы хотели бы использовать некоторую управляемую событиями архитектуру. В этом году я читал здесь и здесь о "Реакторе" и, ища его в Интернете, наткнулся на "Акку".
Итак, теперь у нас есть 3 варианта:
- Spring
ApplicationEvent
: http://docs.spring.io/spring/docs/4.0.0.RELEASE/javadoc-api/org/springframework/context/ApplicationEvent.html -
Reactor
: https://github.com/reactor/reactor#reactor -
Akka
: http://akka.io/
Я не смог найти реального сравнения.
Теперь нам просто нужно что-то вроде:
-
X
регистры для прослушиванияEvent E
-
Y
регистры для прослушиванияEvent E
-
Z
отправляетEvent E
И затем X
и Y
будут получать и обрабатывать событие.
Скорее всего мы будем использовать это в асинхронном режиме, но наверняка будут и некоторые синхронные сценарии. И мы скорее всего отправляем всегда класс как событие. (Образцы Reactor в основном используют шаблоны String и String, но также поддерживают объекты).
Насколько я понял, ApplicationEvent
работает синхронно по умолчанию, а Reactor
работает как метод async. И Reactor
также позволяет использовать метод await()
, чтобы сделать его синхронным. Akka
обеспечивает более или менее то же, что и Reactor
, но также поддерживает Remoting.
Что касается метода Reactor await()
: может ли он ждать завершения нескольких потоков? Или, может быть, даже частичный набор этих потоков? Если взять пример сверху:
-
X
регистры для прослушиванияEvent E
-
Y
регистры для прослушиванияEvent E
-
Z
отправляетEvent E
Можно ли сделать это синхронным, сказав: Подождите, пока закончите X
и Y
. И можно ли его подождать только для X
, но не для Y
?
Возможно, есть и альтернативы? Как насчет, например, JMS?
Множество вопросов, но, надеюсь, вы можете дать ответы на них.
Спасибо!
EDIT: примеры использования
-
Когда запускается определенное событие, я хотел бы создать 10000 писем. Каждое электронное письмо должно генерироваться с использованием пользовательского контента. Поэтому я создаю много потоков (max = системные ядра процессора), которые создают почту и не блокируют поток вызывающего, потому что это может занять несколько минут.
-
Когда запускается определенное событие, я хотел бы собирать информацию из неизвестного числа служб. Каждая выборка занимает около 100 мс. Здесь я мог бы предположить использование Reactor
await
, потому что мне нужна эта информация для продолжения моей работы в основном потоке. -
Когда запускается определенное событие, я хотел бы выполнить некоторые операции на основе конфигурации приложения. Таким образом, приложение должно иметь возможность динамически (un) регистрировать comsumers/обработчики событий. Они будут делать свои вещи с Событием, и мне все равно. Поэтому я бы создал поток для каждого из этих обработчиков и просто продолжал выполнять свою работу в основном потоке.
-
Простая развязка: я в основном знаю все приемники, но я просто не хочу называть каждого получателя в моем коде. Это должно выполняться синхронно.
Звучит так, как будто мне нужен ThreadPool или RingBuffer. У этих структур есть динамические RingBuffers, которые растут по размеру, если это необходимо?