3

我正在评估 Reactor ( https://github.com/reactor/reactor ) 是否适合在我的 Spring / 企业应用程序中创建事件调度框架。

首先,考虑一个场景,其中您有一个接口A和具体的事件类BC等等。我想将具体事件分派给多个消费者,即观察者。这些Reactor在 bean 后处理期间注册到全局实例。但是,您可以动态注册它们。在大多数情况下,只有一个生产者以高速率向多个消费者发送事件。

我使用Selector了 s,即,ClassSelector将正确的事件类型分派给正确的消费者。这似乎工作得很好。

Reactor reactor = ...
B event = ...
Consumer<Event<B>> consumer = ...

// Registration is used to cancel the subscription later
Registration<?> registration = reactor.on(T(event.getClass()), consumer);

要通知,请使用事件的类型作为键

B event = ...
reactor.notify(event.getClass(), Event.wrap(event));

但是,我想知道这是否是有效调度事件的建议方法?

其次,我想知道是否可以根据事件数据过滤事件?如果我理解正确,Selectors 仅用于检查密钥。我在这里指的不是事件标头,而是特定于域的对象属性。我想知道使用Streamsand Stream.filter(Predicate<T> p),但是是否也可以使用Reactorand Selectors 进行过滤?当然,我可以编写一个委托消费者来检查数据并在需要时将其委托给注册消费者。

4

1 回答 1

1

有一个帮助对象称为Selectors帮助创建各种内置Selector实现。在那里你可以看到对PredicateSelector. 这PredicateSelector非常有用,因为它允许您完全控制通知键的匹配。它可以是一个 Spring @Bean、一个匿名内部类、一个 lambda 或任何其他符合简单Predicate接口的东西。

或者,如果您的类路径中有JsonPath 库,那么您可以使用JsonPathSelector基于 JsonPath 查询的匹配。

在这两种情况下,如果重要数据实际上是域对象本身,则不需要为键设置单独的对象。只需通知对象并将其Event<Object>作为第二个参数传递。

MyPojo p = service.next();
reactor.notify(p, Event.wrap(p));
于 2014-08-01T13:04:18.113 回答