【问题标题】:How is an Event stored in Axon EventStore?事件如何存储在 Axon EventStore 中?
【发布时间】:2020-11-12 16:39:10
【问题描述】:

以下示例使用 Axon 通过 Spring 实现事件溯源(和 CQRS)。

https://github.com/dashsaurabh/event-sourcing-cqrs-axon-spring-boot

关于代码的文章:

http://progressivecoder.com/event-sourcing-and-cqrs-with-axon-and-spring-boot-part-2//

在应用程序中:

  • JPA 存储库存储实体的实际状态
  • 事件存储在单独的 EventStore 中。

我很难理解在示例中,事件是如何存储在 EventStore 中的。在 AccountQueryServiceImpl 中,创建了一个 EventStore 并用于从中读取事件。但是 EventStore 是如何准确填充的呢? (服务类由 REST Endpoint 调用)

关于 JPA 存储库 accountRepository,每当 BaseEvent 发生时,通过使用 AccountQueryEntityManager 中的 save() 方法保存一个新帐户被解雇,但我找不到将某些内容附加到 EventStore 的代码行。

AccountQueryServiceimpl

@Service
public class AccountQueryServiceImpl implements AccountQueryService {

private final EventStore eventStore;

private final AccountRepository accountRepository;

public AccountQueryServiceImpl(EventStore eventStore, AccountRepository 
accountRepository) {
    this.eventStore = eventStore;
    this.accountRepository = accountRepository;
}

@Override
public List<Object> listEventsForAccount(String accountNumber) {
    return eventStore.readEvents(accountNumber).asStream().map( s -> 
s.getPayload()).collect(Collectors.toList());
}

@Override
public AccountQueryEntity getAccount(String accountNumber) {
    return accountRepository.findById(accountNumber).get();
}
}

AccountQueryEntityManager

@Component
public class AccountQueryEntityManager {

@Autowired
private AccountRepository accountRepository;

@Autowired
@Qualifier("accountAggregateEventSourcingRepository")
private EventSourcingRepository<AccountAggregate> accountAggregateEventSourcingRepository;

@EventSourcingHandler
void on(BaseEvent event){
persistAccount(buildQueryAccount(getAccountFromEvent(event)));
}


private AccountAggregate getAccountFromEvent(BaseEvent event){
return accountAggregateEventSourcingRepository.load(event.id.toString()).getWrappedAggregate().getAggregateRoot();
}

private AccountQueryEntity findExistingOrCreateQueryAccount(String id){
return accountRepository.findById(id).isPresent() ? accountRepository.findById(id).get() : new AccountQueryEntity();
}

private AccountQueryEntity buildQueryAccount(AccountAggregate accountAggregate){
AccountQueryEntity accountQueryEntity =     findExistingOrCreateQueryAccount(accountAggregate.getId());

accountQueryEntity.setId(accountAggregate.getId());
accountQueryEntity.setAccountBalance(accountAggregate.getAccountBalance());
accountQueryEntity.setCurrency(accountAggregate.getCurrency());
accountQueryEntity.setStatus(accountAggregate.getStatus());

return accountQueryEntity;
}

private void persistAccount(AccountQueryEntity accountQueryEntity){
accountRepository.save(accountQueryEntity);
}
}

【问题讨论】:

  • 请不要通过指向外部来源的链接提供您问题的主要部分。将您有疑问的代码放在您的问题中,并正确格式化为代码。如果这样做工作量太大或涉及太多代码,那么您的问题可能太宽泛了。您需要提供一些简明扼要的内容,让读者无需离开并研究 GitHub 上的项目即可提出问题。
  • 谢谢,我会的。

标签: spring cqrs axon


【解决方案1】:

Axon 框架旨在为您提供使用 DDD、CQRS 和事件溯源的简单构建块。通过这种方式,开箱即用地提供了许多管道,让您在这条路上的生活尽可能轻松。

要了解它是如何工作的,需要注意的是假设共享样本集中在所有三种范式上。在这种情况下,您将使用事件作为应用程序的命令和查询端之间的同步方式(通常以不同模型的形式)。

应用程序的命令端将通过处理命令和验证它自己的状态来处理业务验证。因此,将发布一个事件。这在典型的 Axon 应用程序中发生在聚合的生命周期内。 让框架用户需要直接连接EventStoreEventBus,确保以正确的顺序存储事件的所有额外复杂性,Axon 提供了AggregateLifecycle#apply(Object) 方法.

在底层框架下,框架将能够自动找到用于发布事件的EventBus,最终也会出现在EventStore中。

旁注

  • 您所指的示例使用 Axon 4。这已经很老了,因为最近发布了 4.4.4。如果您尝试一下,请使用更新的样本作为指导,例如 AxonIQ 的 Hotel Demo
  • 您想知道的任何其他细节都在Reference Guide 中有很好的记录。如果您要进一步研究这个问题,我强烈建议您打开一个标签页,并准备好指南。
  • 还有一些在线视频可以帮助您开始使用 Axon。对于那些喜欢视频材料而不是文本的人,请查看this YouTube 频道。 This 系列是一个真正的快速入门,可能也会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多