【发布时间】:2020-04-22 09:41:16
【问题描述】:
我们正在将 axon 集成到我们现有的 Spring Boot 应用程序中。我们目前正在使用 Axon 4.1.2 和 Axon Server。
例如在注册过程中,我们触发一个RegisterCommand,它被RegisterAggregate读取并触发RegistrationDoneEvent。
有两个EventHandlers 在收听这个RegistrationDoneEvent。分别是RegistrationNeo4jEventHandler 和RegistrationSqlEventHandler。
在没有异常的情况下一切正常。但是,当出现异常时,假设 Neo4JEventHandler 收到事件,如果出现异常,则调用 SqlEventHandler sill 并且似乎所有内容仍会在 SqlEventHandler 上回滚,即使 SqlEventHandler运行成功。
我们如何才能使SqlEventHandler 完成并提交但Neo4JEventHandler 重试?
其次,我们如何在失败时完全停止重试事件?假设我们有四个事件处理程序(HandlerA、HandlerB、HandlerC、HandlerD)监听 SAME 事件。如果 HandlerC 失败,我们希望在修复基础问题时触发它重试,但还要确保其他侦听 SAME 事件的处理程序不会重新运行。
以下代码 sn-ps 包括聚合和事件处理程序。
注册聚合
@Aggregate
public class RegisterAggregate {
....
@CommandHandler
public RegisterAggregate(RegisterCommand command) {
apply(new RegistrationDoneEvent(command));
}
}
RegistrationSqlEventHandler
@Service
@Transactional
public class RegistrationSqlEventHandler {
@EventHandler
@Order(Ordered.HIGHEST_PRECEDENCE)
public void on(RegistrationDoneEvent event) {
....
}
}
RegistrationNeo4jEventHandler
@Service
@Transactional
public class RegistrationNeo4jEventHandler {
@EventHandler
public void on(RegistrationDoneEvent event) {
....
}
}
【问题讨论】:
标签: java spring spring-boot cqrs axon