我想使用类似的Reactor:
reactor.notify(new CreatedEvent<A>(a));
reactor.notify(new CreatedEvent<B>(b));
我的活动很简单:
public class CreatedEvent<E> extends Event<E> {
public CreatedEvent(E data) {
super(data);
}
}
然后消费那样的事件:
reactor.on(new Consumer<CreatedEvent<A>>() {
@Override
public void accept(CreatedEvent<A> t) {
/* do something with a */
}
});
reactor.on(new Consumer<CreatedEvent<B>>() {
@Override
public void accept(CreatedEvent<B> t) {
/* do something with b */
}
});
但我同时收到两位消费者的活动。
如果我使用选择器,它可以工作,即:
reactor.notify("created.a", Event.wrap(a));
reactor.on(Selectors.$("created.a"), new Consumer<Event<A>>() {
@Override
public void accept(Event<A> t) {
/* do something with a */
}
});
但是使用选择器我必须编写和维护非常多的String。
是否都在使用选择器?或者我可以以某种方式&#34;通过参数化类类型&#34;?
进行选择答案 0 :(得分:3)
但我同时收到两位消费者的活动。
右。因为您将这两个事件发送到同一个reactor
只发送到defaultKey
。
并将consumers
订阅到defaultSelector
。
在这种情况下,它没有使用您使用的Event
类型的值:默认Selector
策略将调度所有类型。
我认为你需要使用ClassSelector
:
reactor.notify(a);
reactor.notify(b);
reactor.on(Selectors.T(A.class), new Consumer<Event<A>>() {});
reactor.on(Selectors.T(B.class), new Consumer<Event<B>>() {});
当然,您必须为每个Selectors.T
键入class-consumer
,但它比ObjectSelector
和自定义Event
更简单。
更新
如何注入custom consumer filter
:
Reactors.reactor()
.eventFilter(new GenericResolverFilter())
.get()
由您决定如何从consumerKey
对象和Consumer
中的每个List<T> items
解析通用参数。无论如何,你应该在这里考虑一些缓存,以允许Reactor继续reactive
。