Axon 如何添加事件 listener/interceptor 以在事件到达其处理程序之前拦截事件?

Axon How can I add an event listener/interceptor to intercept events before they reach their handlers?

我有一个投影 class(构建一个读取模型),我想为其事件添加一个拦截器,如果事件中传递的 id 导致空对象(非存在于我的数据库中)然后我想阻止它,否则让它通过。

这样我就可以避免在每个事件处理程序上添加空检查器。

@EventHandler
public void onEvent(Event event) {
    Entity entity = getEntity(event.getId());
    if(entity!=null){        // what I don't want to add on every event handler
        dostuff();
    }
}

我发现 axon 提供了一个名为 EventListener 的接口,但我不确定如何使用它,我不确定这是否会拦截我的所有事件,或者我是否能够拦截 select 个事件。

官方文档中没有提到这个接口(没有实际示例)

你说得对,参考指南仍然需要一些改进@bleh10 - 我可以向你保证,他们正在努力,团队只是相对分散。

在没有追捧的例子的情况下,我想我可以给你一些指导。

您正在寻找的是 MessageHandlerInterceptor 实现,专门针对 EventMessage 类型。顾名思义,它会在处理消息之前拦截消息,这与您提出的问题完全一致。

其次,您显然需要一个地方来配置这些。在 Axon 应用程序中,将事件传递给 @EventHandler 注释方法的技术方面是事件处理器。因此,它负责确保流经它的事件消息按需要被拦截。

因此,配置 EventMessage MessageHandlerInterceptor 的位置在您选择的 EventProcessor 实现上。为确保给定的事件处理组件在特定的 EventProcessor 中设置,您可以通过使用 @ProcessingGroup 注释对 class 进行注释来指定它的处理组。

从那时起,您可以使用 EventProcessingConfigurer 轻松地为您的事件处理器配置特定属性。更具体地说,我建议为此使用 EventProcessingConfigurer#registerHandlerInterceptor(String, Function<Configuration, MessageHandlerInterceptor<? super EventMessage<?>>>) 方法。

第一个 String 参数用于描述您的处理组的名称。第二个是 Function 接收 Axon Configuration 并且应该输出 MessageHandlerInterceptor 可以处理 EventMessage class.

希望对您有所帮助!