We're going to start a new Spring 4 application in a few weeks. And we'd like to use some event-driven architecture. This year I read here and there about "Reactor" and while looking for it on the web, I stumbled upon "Akka".
So for now we have 3 choices:
- Spring's
ApplicationEvent
: http://docs.spring.io/spring/docs/4.0.0.RELEASE/javadoc-api/org/springframework/context/ApplicationEvent.html Reactor
: https://github.com/reactor/reactor#reactorAkka
: http://akka.io/
I couldn't find a real comparison of those.
For now we just need something like:
X
registers to listen forEvent E
Y
registers to listen forEvent E
Z
sends anEvent E
And then X
and Y
will receive and handle the event.
We will most likely use this in a async way, but for sure there will be also some synchronous scenarios. And we most likely send always a class as event. (The Reactor samples mostly make use of Strings and String patterns, but it also supports Objects).
As far as I understood, ApplicationEvent
works synchronous by default and Reactor
works the async way. And Reactor
also allows to use the await()
method to make it kinda synchronous. Akka
provides more or less the same as Reactor
, but also supports Remoting.
Concerning Reactor's await()
method: Can it wait for multiple threads to complete? Or maybe even a partial set of those threads? If we take the example from above:
X
registers to listen forEvent E
Y
registers to listen forEvent E
Z
sends anEvent E
Is it possible to make it synchronous, by saying: Wait for X
and Y
to complete. And is it possible to make it wait just for X
, but not for Y
?
Maybe there are also some alternatives? What about for example JMS?
Lot of questions, but hopefully you can provide some answers!
Thank you!
EDIT: Example use cases
When a specific event gets fired, I'd like to create 10000 emails. Every email has to get generated with user specific content. So I'd create a lot of threads (max = system cpu cores) which create the mails and do not block the caller thread, 'cause this can take some minutes.
When a specific event gets fired, I'd like to collect information from an unknown number of services. Each fetch takes about 100ms. Here I could imagine using Reactor's
await
, 'cause I need those information for continuing my work in the main thread.When a specific event gets fired, I'd like to perform some operations based on application configuration. So the application must be able to dynamically (un)register comsumers/event handlers. They'll do their own stuff with the Event and I don't care. So I would create a thread for every of those handlers and just continue doing my work in the main thread.
Simple decoupling: I basically know all receivers, but I just don't want to call every receiver in my code. This should mostly get done synchronously.
Sound like I need a ThreadPool or a RingBuffer. Do those frameworks have dynamic RingBuffers, which grow in size if needed?