可以使用Reactor和Spring按事件类型(或事件参数类型)进行选择?

时间:2014-01-19 07:36:34

标签: spring events consumer reactor

我想使用类似的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;?

进行选择

1 个答案:

答案 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