0

我想使用类似的反应堆:

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 */
    }
});

但是使用选择器我将不得不编写和维护非常多的字符串。

都是关于使用选择器的吗?还是我可以以某种方式“按参数化类类型选择”?

4

1 回答 1

3

但是我收到了两个消费者的两个事件。

正确的。因为您将两个事件都发送到相同reactordefaultKey. 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为 each键入class-consumer,但它更简单,然后是ObjectSelectorcustom Event

更新

如何注入custom consumer filter

Reactors.reactor()
            .eventFilter(new GenericResolverFilter())
            .get()

如何解决来自consumerKeyObject 的通用参数和每个Consumer来自List<T> items. 无论如何,您应该在这里考虑一些缓存以允许 Reactor 继续存在reactive

于 2014-01-19T15:46:29.670 回答