所以现在我们有三个选择:
- 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
注册以侦听事件 E
Y
注册以侦听事件 E
Z
发送一个事件 E
X
和 Y
将接收并处理该事件。我们很可能会以异步方式使用它,但肯定也会有一些同步场景。而且我们很可能总是发送一个类作为事件。(Reactor示例大多使用字符串和字符串模式,但它也支持对象)。
据我所了解,
ApplicationEvent
默认同步工作,而 Reactor
则以异步方式工作。同时,Reactor
还允许使用 await()
方法使其变得类似于同步。Akka
提供了与 Reactor
差不多的功能,但还支持远程操作。关于 Reactor 的
await()
方法:它是否可以等待多个线程完成?或者甚至是这些线程的部分集合?如果我们采用上面的例子:
X
注册以侦听Event E
Y
注册以侦听Event E
Z
发送一个Event E
X
和 Y
完成”来使其同步化?并且是否可以只等待 X
而不等待 Y
?
也许还有其他选择?比如JMS?有很多问题,但希望你能提供一些答案!谢谢!
编辑:使用案例示例
当特定事件触发时,我想创建10000封电子邮件。每个电子邮件都必须使用特定用户内容生成。因此,我会创建大量线程(最大=系统CPU核心),这些线程将创建邮件并不会阻塞调用线程,因为这可能需要几分钟。
当特定事件触发时,我希望从未知数量的服务中收集信息。每个获取需要大约100毫秒。在这里,我可以想象使用Reactor的
await
,因为我需要这些信息来继续我的主线程工作。当特定事件触发时,我希望根据应用程序配置执行一些操作。因此,应用程序必须能够动态(取消)注册消费者/事件处理程序。他们将使用事件进行自己的操作,而我不在乎。因此,我将为每个处理程序创建一个线程,并在主线程中继续执行我的工作。
简单的解耦:我基本上知道所有接收方,但我只是不想在我的代码中调用每个接收方。这应该大多数情况下同步完成。
听起来我需要一个线程池或环形缓冲区。这些框架是否具有动态环形缓冲区,如果需要可以增长大小?