AxonFramework 注解处理器支持参数详解
概述
在 AxonFramework 中,注解处理器(如 @CommandHandler
、@EventHandler
和 @QueryHandler
)是处理消息的核心组件。这些处理器方法的参数可以通过框架自动解析和注入,这为开发者提供了极大的灵活性。本文将深入解析 AxonFramework 中各种注解处理器支持注入的参数类型及其用途。
参数解析机制
AxonFramework 通过 ParameterResolver
机制来解析处理器方法的参数。这个机制由 ParameterResolverFactory
构建,负责为命令、事件和查询处理器注入所需的参数。
开发者可以通过实现 ParameterResolverFactory
接口来扩展参数解析器,支持自定义参数类型的注入。这种设计使得框架具有很好的扩展性。
命令处理器参数
@CommandHandler
注解的方法支持以下参数类型:
-
命令负载:第一个参数默认是命令消息的负载(payload)。也可以声明为
Message
或CommandMessage
类型来获取完整的消息。 -
元数据:
MetaData
类型:获取命令消息的全部元数据@MetaDataValue
注解:获取指定键的元数据值
-
消息相关:
Message
或CommandMessage
:获取完整的消息对象@MessageIdentifier
注解的String
:获取消息标识符
-
工作单元:
UnitOfWork
:获取当前工作单元,用于注册特定阶段执行的操作或访问注册的资源
-
其他实用参数:
ConflictResolver
:获取配置的冲突解析器实例InterceptorChain
:获取命令消息的拦截器链ScopeDescriptor
:用于通过DeadlineManager
调度截止时间
-
Spring 集成:
- 任何 Spring Bean,可配合
@Qualifier
指定特定版本的 Bean
- 任何 Spring Bean,可配合
事件处理器参数
@EventHandler
注解的方法支持以下参数类型:
-
事件负载:第一个参数默认是事件消息的负载。可以通过
@EventHandler
注解指定期望的负载类型。 -
元数据:
EventMessage
:获取完整的事件消息MetaData
:获取全部元数据@MetaDataValue
:获取指定键的元数据值
-
时间相关:
@Timestamp
注解的Instant
或Temporal
:获取事件生成的时间戳@SequenceNumber
注解的Long
/long
:获取领域事件的序列号(仅限聚合源事件)
-
聚合相关:
@SourceId
注解的String
:获取聚合标识符(仅限聚合源事件)TrackingToken
:获取与处理事件相关的当前令牌(仅限流式事件处理器)
-
特殊处理:
DeadLetter<EventMessage<?>>
:获取与处理事件相关的死信(可为空)ReplayStatus
:获取事件传递状态(常规或重放)
-
Spring 集成:
- 任何 Spring Bean,可配合
@Qualifier
指定特定版本的 Bean
- 任何 Spring Bean,可配合
查询处理器参数
@QueryHandler
注解的方法支持以下参数类型:
-
查询负载:第一个参数默认是查询消息的负载。也可以声明为
Message
或QueryMessage
类型。 -
元数据:
MetaData
:获取全部元数据@MetaDataValue
:获取指定键的元数据值
-
消息相关:
Message
或QueryMessage
:获取完整的消息对象@MessageIdentifier
注解的String
:获取消息标识符
-
工作单元:
UnitOfWork
:获取当前工作单元
-
Spring 集成:
- 任何 Spring Bean,可配合
@Qualifier
指定特定版本的 Bean
- 任何 Spring Bean,可配合
最佳实践
-
参数顺序:将最重要的参数(通常是负载)放在方法签名的最前面,其他辅助参数放在后面。
-
元数据访问:如果需要访问多个元数据字段,建议使用
MetaData
类型参数而非多个@MetaDataValue
注解参数。 -
性能考虑:对于高频调用的处理器,避免注入不必要的大对象(如完整的
Message
对象)。 -
类型安全:尽可能使用具体的负载类型而非通用的
Message
类型,以提高代码的可读性和类型安全性。 -
扩展性:对于特殊需求,考虑实现自定义的
ParameterResolverFactory
来支持特定参数类型的注入。
通过合理利用这些参数注入特性,可以编写出既简洁又功能强大的消息处理器,充分发挥 AxonFramework 的能力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考