Command Handler
Command Handler 负责处理 Command,每个 Command Handler 只负责处理一种类型的 Command。
定义
在 axon 中,在 spring 下定义 Command Handler 非常简单,只要定义一个普通的 spring bean:
@Bean
public BankAccountCommandHandler bankAccountCommandHandler() {
return new BankAccountCommandHandler(axonConfiguration.repository(BankAccount.class), eventBus);
}
然后在这个 spring bean 的方法上加一个 @CommandHandler 的注解:
这个方法就可以扮演 Command Handler 的角色,而这个方法的参数就是对应的 Command 类型。
Command 处理流程
Command Handler 从 repository 中获取领域对象(Aggregates)并执行他们的方法来修改他们的状态。这些 Aggregates 通常包含实际的业务逻辑,同时也因此需要负责保护他们自己的不可变量。
Aggregates 的状态变更导致 Domain Events 的生成。Domain Events 和 Aggregates 组成 domain model / 领域模型。
以下是一个 CommandHandler 的工作代码,用来处理 DepositMoneyCommand 命令:
@CommandHandler
public void handle(DepositMoneyCommand command) {
// 从 repository 中装载 BankAccount 的Aggregate
Aggregate<BankAccount> bankAccountAggregate = repository.load(command.getBankAccountId());
// 通过 bankAccountAggregate 来执行 deposit 操作
// deposit 操作的实现是通过 BankAccount 这个 Aggregate 来执行的
bankAccountAggregate.execute(bankAccount -> bankAccount.deposit(command.getAmountOfMoney()));
}
而在 BankAccount 中,deposit() 方法的实现,是发送一个 MoneyDepositedEvent 到 event bus:
@Aggregate
public class BankAccount {
......
public void deposit(long amount) {
apply(new MoneyDepositedEvent(id, amount));
}
}
Event bus 会随后将 MoneyDepositedEvent 分派给感兴趣的 Event handler.