我正在评估Reactor(https://github.com/reactor/reactor)是否适合在我的Spring / enterprise应用程序中创建事件调度框架。
首先,考虑一个具有接口A
和具体事件类B
,C
等的场景。我想向多个消费者即观察者发送具体事件。这些在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
仅用于检查密钥。我不是指这里的事件标题,而是指特定于域的对象属性。我想知道如何使用Streams
和Stream.filter(Predicate<T> p)
,但也可以使用Reactor
和Selector
进行过滤吗?当然,我可以编写一个委托消费者来检查数据,并在需要时将其委托给注册的消费者。
答案 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));