Axon如何添加事件侦听器/拦截器以在事件到达处理程序之前对其进行拦截?

时间:2019-05-22 09:47:00

标签: spring domain-driven-design interceptor event-sourcing axon

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

这样,我将在每个事件处理程序上避免添加null检查器。

@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();
    }
}

我发现轴突提供了一个名为EventListener的接口,但我不确定如何使用它,也不确定是否会截获所有事件或是否能够截获我的事件选择事件。

除了官方文档(没有任何实际示例)之外,此界面没有任何提及

1 个答案:

答案 0 :(得分:0)

您是正确的,《参考指南》仍然需要一些改进@ bleh10-我可以向您保证,他们正在研究中,团队规模相对较小。

在没有受到追捧的例子的情况下,我想我可以为您提供一些指导。

您要寻找的是MessageHandlerInterceptor实现,特别是针对EventMessage类型的实现。顾名思义,它会在处理之前拦截邮件,这与您提出的问题完全吻合。

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

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

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

第一个String参数用于描述处理组的名称。第二个是Function,它接收轴突Configuration,并应该输出可以处理MessageHandlerInterceptor类的EventMessage

希望这对您有所帮助!