如何使用Reactor将事件分派给多个使用者并根据事件数据过滤事件?

时间:2014-08-01 07:21:45

标签: events reactor project-reactor

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

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

我使用Selector,即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));

但是,我想知道这是否是建议有效发送事件的方式?

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

1 个答案:

答案 0 :(得分:1)

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

或者,如果您的类路径中有JsonPath library,则可以使用JsonPathSelector根据JsonPath查询进行匹配。

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

MyPojo p = service.next();
reactor.notify(p, Event.wrap(p));