java - 观察特定类型的事件

标签 java jakarta-ee java-ee-6 observer-pattern observers

我在 Java EE 中使用观察者模型,其想法是让一个服务向多个观察者触发事件。然而,尽管所有观察者都在监听同一个事件,但每个观察者只对事件内部指定的特定事件类型感兴趣。我当前的代码是这样的:

public class Service {
    public void fireEvent(EventType type) {
        MyEvent event = new MyEvent(type);
        fire(event);
    }
}

public class TypeAObserver {
    public void observeEvent(@Observes MyEvent event) {
        if (EventType.TYPE_A.equals(event.getType()) {
            // do something
        }
    }
}

public class TypeBObserver {
    public void observeEvent(@Observes MyEvent event) {
        if (EventType.TYPE_B.equals(event.getType()) {
            // do something
        }
    }
}

正如您所看到的,所有观察者都必须在执行进一步操作之前检查类型,这会增加源代码内的重复。而且,由于所有观察者都会收到相同的事件,而只有少数观察者真正处理它,这恐怕会带来不必要的性能开销。

因此,我正在寻找其他方法,最好不使用 Java EE 之外的任何新库,以使每个观察者仅监听特定类型的事件。

最佳答案

  • 您可以为每种事件类型使用单独的队列/事件:

public void observeEvent(@Observes MyEventOfType1 event)
public void observeEvent(@Observes MyEventOfType2 event)

  • 在通用队列之上构建过滤队列:过滤队列根据事件类型进行过滤。然后让消费者观察过滤后的队列。

伪代码:

public class TypeAFilter {
    List listeners ll = ArrayList<Listener>();

    public void add(Listener l) {
        l.add(ll);
    }

    public void observeEvent(@Observes MyEvent event) {
        if (EventType.TYPE_A.equals(event.getType()) {
            for (Listener l : ll) {
                l.observeEvent(event);
            }
        }
    }
}

}

这基本上意味着过滤器过滤器既是观察者又是可观察的。过滤器正在观察您的服务,特定事件的消费者附加到过滤器。

  • 考虑将 instanceof 与不同的事件类一起使用,但我不确定它是否真的比 equals 更快

  • 使用限定符:

public void observeEvent(@Observes @EventType1 MyEvent event)
public void observeEvent(@Observes @EventType2 MyEvent event)

请参阅 Oracle 的 example ,以及限定符如何 defined

关于java - 观察特定类型的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17165655/

相关文章:

java - 什么时候或者哪种类型的java包被称为native?

java - 如何在非组件类中使用 JFileChooser.showOpenDialog()?

java - 从 war 文件在 JBoss 5 中提供静态内容的最简单方法是什么?

web-services - axistools-maven-plugin 未从 WSDL 生成源代码

java - 无法将 '' 下的属性绑定(bind)到 com.zaxxer.hikari.HikariDataSource : spring boot 2. 4.1

java - Java 中 Postgresql 日期从时间戳到字符串

java - "synchronized-with-resource"获取锁对象也必须同步怎么办?

java - ehcache中是否必须有cache.xml?

java - 如何在 Weblogic 10.3.x 上利用 EL 2.2 功能?

ejb - @专门针对EJB