Axon Framework官方文档(六)

6. Event Handling(事件处理)

事件监听器是作用于传入事件的组件。它们通常基于由命令模型做出的决策来执行响应的逻辑。通常,这包括更新视图模型(即CQRS的查询模型)或将更新转发到其他组件,如第三方集成。在某些情况下,事件处理程序将根据所接收到的事件(模式)将事件本身抛出,甚至发送命令来触发进一步的更改。

6.1 Defining Event Handlers(定义事件处理器)

在Axon中,对象可以通过@ eventhandler注解来声明一些事件处理器方法。方法的参数声明定义它将接收到的事件。
Axon提供了以下开箱即用的参数类型的支持:
>第一个参数始终是事件消息的payload(有效负载)。在事件处理程序不需要访问消息的有效负载的情况下,您可以在@ eventhandler注释中指定预期的payload(有效负载)类型。当指定时,第一个参数将使用下面指定的规则来解析。如果您希望有效负载作为参数传递,则不要在注释上配置有效负载类型.
>使用@MetadataValue注解的参数将以注解上显示的键解析元数据的值。如果required是false(默认值),则在不存在元数据的值时传递null。如果required是true的话,当元数据值不存在时,解析器将不匹配并阻止该方法被调用。
>MetaData类型的参数将会注入EventMessage消息的所有的Meta-data信息
>以@Timestamp注解标识,且是java.time.Instant(或者java.time.temporal.Temporal)类型的入参,将会被解析为EventMessage的时间戳,代表的是事件产生的事件
>带有@SequenceNumber注解,并且参数类型是long的入参,会被解析为DomainEventMessage的sequenceNumber 。这提供了事件生成的顺序
>Message类型的参数将会被整个EventMessage所注入(如果消息是可分配给该参数的)。如果第一个参数是类型消息,则它有效地匹配任何类型的事件,即使泛型参数会建议其他类型。由于类型擦除,Axon不能检测出预期的参数。在这种情况下,最好声明有效负载类型的参数,然后是类型消息的参数。
>当使用Spring,且Axon配置被激活时(或者通过包括Axon-Spring-Boot-Starter模块,或者通过在 Configuration文件中指定@ EnableAxon),如果在应用程序上下文中恰好有一个可选的候选项,任何其他参数都将被解析到autowired注入进来的bean上。这允许您直接将资源注入到@ eventhandler注释方法。
您可以配置额外ParameterResolvers通过实现ParameterResolverFactory接口和创建一个名为/META-INF/service/org.axonframework.common.annotation.ParameterResolverFactory的文件包含实现类的完全限定名称。有关详细信息,请参见Advanced Customizations(高级定制)。
在所有情况下,在每个侦听器实例中调用最多一个事件处理程序方法。Axon将搜索最具体的调用方法,使用以下规则:
>1.在类层次结构的实际实例级别(如this . getclass()返回),将对所有带注释的方法进行评估
>2.如果找到了一个或多个方法,其中所有参数都可以解析为一个值,那么选择和调用最具体类型的方法
>3.如果在这个级别的类层次结构中没有找到方法,那么超类的计算方法是相同的
>4.当达到层次结构的顶层时,没有找到合适的事件处理程序,事件就被忽略了。
// assume EventB extends EventA 
// and    EventC extends EventB

public class TopListener {

    @EventHandler
    public void handle(EventA event) {
    }

    @EventHandler
    public void handle(EventC event) {
    }
}

public class SubListener extends TopListener {

    @EventHandler
    public void handle(EventB event) {
    }

}
在上面的示例中,子监听器将接收EventB的所有实例以及EventC(因为它扩展EventB)。换句话说,TopListener将不会接收到EventC的任何调用。由于EventA不能用于EventB(它是它的父类),所以这些将由TopListener处理。

6.2 Registering Event Handlers(注册事件处理器)

事件处理组件使用一个EventHandlingConfiguration类定义,并伴随着全局Axon的全局的Configurer被注册为一个模块。通常,一个应用程序将有一个EventHandlingConfiguration定义,但是更大更模块化的应用程序可以选择每个模块定义一个。
使用@EventHandler的方法来注册对象,使用EventHandlingConfiguration的registerEventHandler方法。
// define an EventHandlingConfiguration
EventHandlingConfiguration ehConfiguration = new EventHandlingConfiguration()
    .registerEventHandler(conf -> new MyEventHandlerClass());

// the module needs to be registered with the Axon Configuration
Configurer axonConfigurer = DefaultConfigurer.defaultConfiguration()
    .registerModule(ehConfiguration);

你可能感兴趣的:(axon)