【问题标题】:Selection by Event Type (or Event parameter type) possible with Reactor and Spring?Reactor 和 Spring 是否可以通过事件类型(或事件参数类型)进行选择?
【发布时间】:2014-01-19 07:36:33
【问题描述】:

我想使用类似的 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 */
    }
});

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

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

【问题讨论】:

    标签: spring events consumer reactor


    【解决方案1】:

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

    没错。因为您将两个事件都发送到同一个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>>() {});
    

    当然,您必须为每个class-consumer 键入Selectors.T,但它比ObjectSelector 和自定义Event 更简单。

    更新

    如何注入custom consumer filter

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

    如何解决来自consumerKey 对象的通用参数以及来自List&lt;T&gt; items 的每个Consumer 取决于您。无论如何,您应该在这里考虑一些缓存,以允许 Reactor 继续为 reactive

    【讨论】:

    • 谢谢。但这只是一半......我需要像“ParameterizedClassSelector”这样的东西,所以我可以写reactor.on(Selectors.T(Created&lt;A&gt;.class), ...)reactor.on(Selectors.T(Deleted&lt;B&gt;.class), ...),这当然不是有效的Java,但我希望你明白我在找什么? (这就是我要找的东西:github.com/reactor/reactor/issues/207 吗?)
    • 实际上,您始终可以编写自己的Selector 实现。另一方面,由于您的封闭类不同,您可以使用通用分辨率实现自己的Filter,并将其注入ConsumerFilteringEventRouter,并继续使用ClassSelector 封闭类。
    • 据我了解,您说我有以下选择:1. 使用带有自定义过滤器的r.on(Selectors.T(Created.class), new Consumer&lt;Event&lt;A&gt;&gt;() {}) 的默认选择器,或2. 编写一个自定义选择器并使用r.on(CustomSelector(Created.class, A.class), new Consumer&lt;Event&lt;A&gt;&gt;() {})。对? 1. 方法对我来说看起来要优雅得多,但我不知道该怎么做。您能否提供一个链接,附加一个小示例代码,说明如何将自定义过滤器注入ConsumerFilterEventRouter
    • 我已经用关于注入自定义Filter的示例更新了我的答案@
    • 谢谢。这个新的过滤器会覆盖旧的过滤器,对吧?对于缓存,我会查看提供的给定过滤器。
    猜你喜欢
    • 2019-02-10
    • 2010-12-16
    • 2012-01-14
    • 2018-04-25
    • 2021-10-15
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多