Spring Boot整合Axon时外部Java文件@EventHandler未触发如何解决
Axon 4.5.3 整合Spring Boot事件监听不触发排查方案
1 包扫描校验
- 确认
EventHandlingComponent所在包在Spring Boot主类的扫描范围内:Spring Boot默认仅扫描主类所在包及其子包下的Bean,若事件处理类位于外层包,需在启动类上添加@ComponentScan(basePackages = {"事件处理类所在包路径", "聚合类所在包路径"})注解 - 可在
EventHandlingComponent类的无参构造方法中添加日志断点,验证项目启动时该类是否被Spring成功实例化,未实例化则是包扫描配置错误
2 事件发布链路校验
- 确认聚合类中
@CommandHandler注解的CreateAccountCommand处理方法内,正确调用了AggregateLifecycle.apply(new AccountCreatedEvent(参数))方法发布事件,未调用apply方法时事件不会进入事件总线,外部监听自然无法触发 - 确认聚合类中
@EventSourcingHandler注解的AccountCreatedEvent处理方法正常执行,若该方法未执行则说明事件本身未生成
3 事件类匹配校验
确认聚合内发布的AccountCreatedEvent,与@EventHandler方法参数中的AccountCreatedEvent为完全相同的类(包路径、类名完全一致),若存在同名异包的情况,Axon会判定为两类不同事件,不会触发监听
4 访问权限与方法签名校验
- 当前示例中
EventHandlingComponent类为默认访问权限(无public修饰符),部分Spring Boot版本会扫描失败,建议将类修改为public修饰 - 确认
@EventHandler注解标注的方法仅包含事件类一个入参,若添加了其他入参Axon会无法识别该监听方法
5 配置规则校验
排除axon-server-connector后Axon默认使用SimpleEventBus无需额外配置,若存在自定义EventBus、EventProcessingConfigurer的配置,需确认未将对应事件处理类排除在事件处理器之外;若手动配置了事件处理器为tracking模式,需确认TokenStore配置正常,否则会出现事件消费失败的情况
快速验证方法
在@CommandHandler方法、@EventSourcingHandler方法、@EventHandler方法中分别添加日志打印,依次核对日志是否出现,即可定位到问题所在环节。
内容的提问来源于stack exchange,提问作者Gurkirat Singh Guliani
相关产品推荐
相关产品推荐

