Event Handler
一些 Handler 将更新用于查询的数据源,而另外一些发送消息到外部系统。
你可能会注意到,command handle 完全不知道哪些组件会对他们做出的变更感兴趣。这意味着可以以非侵入性的方式来用新功能扩展应用程序。所有需要做的只是添加另一个 Event Handler。事件耦合了应用程序中的所有组件。
在某些情况下,事件处理要求发送新的 command 到应用。例如,当接收到订单时,这意味着客户的账号需要扣除购买的总价,而物流必须被告知要准备被购买货物的送货。
在很多应用中,逻辑比这个更加的复杂:如果客户没有及时支付? 应该立即发送给物流,还是等先完成支付? saga 是CQRS 中负责管理这些复杂业务实物的概念。
Axon
同一个 Domain Event 是可以发送给多个 Event Handler 的,比如肯定需要有一个 Event Handler 来处理上面的 MoneyAddedEvent,然后将修改之后的数据保存起来,如类 BankAccountEventListener:
public class BankAccountEventListener {
......
public void on(MoneyAddedEvent event) {
BankAccountEntry bankAccountEntry = repository.findOneByAxonBankAccountId(event.getBankAccountId());
bankAccountEntry.setBalance(bankAccountEntry.getBalance() + event.getAmount());
broadcastUpdates();
}
}
有两个 repository
BankAccountRepository
这个是 org.springframework.data.repository
用于 BankAccountController, 用于查询 BankAccountEntry