axon-事件处理
Event Handling
Event listeners组件主要是将接收到的事件进行处理。他们通常是根据命令模型来做具体的业务逻辑处理。通常涉及更新视图模型或将更新转发给其他组件,如第三方集成。在某些情况下,Event Handlers会根据事件的(模式)而自己发出事件,甚至发送命令来触发进一步的更改。
定义Event Handlers
在Axon中,一个对象可以用@EventHandler注解来声明多个Event Handler方法。方法的声明参数定义了它将接收什么样的事件。
Axon提供以下参数类型的开箱即用支持:
- 第一个参数总是事件消息的payload 。在 Event Handlers不需要访问消息的payload的情况下,您可以在@EventHandler注解中指定你所期望的payload类型。指定时,使用下面指定的规则来解析第一个参数。如果您希望将payload作为参数传递,请不要在注解中配置payload类型。
- 用@MetaDataValue注解的参数,将用注解上的键对元数据值进行解析。如果这个值是false(默认),则当元数据值不存在时会传递null。如果值是true,而元数据值不存时,这时解析器会发现错误,并阻止该方法的调用。
- 参数为MetaData的话,那么将注入一个EventMessage的整个MetaData
- 使用@Timestamp注解并且类型为java.time.Instant(或java.time.temporal.Temporal)的参数将解析为EventMessage的时间戳。这是事件产生的时间。
- 用@SequenceNumber和类型java.lang.Long或long注解的参数将解析为DomainEventMessage的sequenceNumber。这提供了事件生成的顺序(在同一聚合范围内的生成顺序)。
- Message类型的参数将会被整个EventMessage所注入(如果消息可分配给该参数),如果第一个参数直接是一个Message类型,则它会匹配任何类型的事件,即使泛型参数可以提供帮助选择,但是由于类型的擦除,axon也不能检测出预期的参数。在这种情况下,最好声明有payload的参数,然后是Message类型的参数。
7.当使用Spring且Axon配置被激活时(通过包含Axon Spring Boot Starter模块,或者在@Configuration文件中指定@EnableAxon),如果当前的上下文中只有一个可入被spring注入的,那么任何其他参数都将被解析到autowired注入进来的bean上。这使您可以将资源直接注入到@EventHandler注解的方法中。
您可以通过实现ParameterResolverFactory接口并创建一个名为/META-INF/service/org.axonframework.common.annotation.ParameterResolverFactory的文件来配置其他ParameterResolver,该文件包含实现类的全名。详情请 参考Advanced Customizations 。
在所有情况下,每个event handler实例最多调用一个事件处理程序方法。 Axon将使用以下规则搜索最匹配的调用方法:
- 在类层次结构(注:类的继承关系)的实际实例层次(由this.getClass()返回)中,将评估所有注解的方法
2.如果找到一个或多个方法可以将所有参数解析为一个值,则选择并调用最匹配(注:像java的多继承接口同时继承一个类的同一个方法调用冲突,也就是子接口或者实现优先)的类型的方法
3.如果在这个级别的类层次结构中没有找到方法,那么超类的评估方法是相同的
4.当达到类层次结构的顶层时,还没有找到合适的事件处理程序,该事件就被忽略掉。
// assume EventB extends EventA // and EventC extends EventB// and a single instance of SubListener is registered
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) {
}
}
在上面的例子中,SubListener的处理器方法将被调用EventB及EventC的所有实例(因为它扩展了EventB)。换句话说,TopListener的处理程序方法根本不会收到EventC的任何调用。由于EventA不能分配给EventB(它是它的父类),所以这些将由TopListener中的处理程序方法处理。
注册Event Handler
事件处理组件是使用EventHandlingConfiguration类定义的,该类是使用全局Axon 配置器注册为模块的。通常,应用程序将定义一个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);
有关使用Spring AutoConfiguration注册事件处理程序的详细信息,请参阅事件处理配置。