Axon-在查询时进行投影的最简单方法

时间:2019-05-27 09:32:25

标签: java domain-driven-design event-sourcing axon

我通常每个聚集有5-6个事件,并且不想在DB中存储投影。始终在查询时进行视图投影的最简单方法是什么?

1 个答案:

答案 0 :(得分:1)

对此的简短回答是,没有简单/快速的方法可以做到这一点。

但是,最肯定的是可以实现“请求时重播给定事件”设置。

我建议您执行的操作分几个步骤:

  1. 创建要返回的查询模型,可以处理事件(在模型上使用@EventHandler带注释的方法)
  2. 创建一个可以处理查询的组件,该组件将在第一步中返回查询模型(为此使用带有@QueryHandler注释的方法。
  3. Query-Handling-Component应该能够从EventStore检索事件流。如果这基于aggregateIdentifier,请使用EventStore#readEvents(String)方法。如果您需要整个事件流,则需要使用StreamableMessageSource#openStream(TrackingToken)方法(注意:EventStore接口实现StreamableMessageSource
  4. 在查询处理后,创建一个AnnotationEventHandlerAdapter,为其提供一个新的查询模型实例
  5. 对于在第3点中创建的事件流中的每个事件,调用AnnotationEventHandlerAdapter#handle(EventMessage)方法。此方法将调用查询模型对象上的@EventHandler带注释的方法
  6. 如果流已用尽,则可以确保查询模型已处理了所有必要的事件。因此,您现在可以返回查询模型

因此,再次,我认为这不是太琐碎,容易或快速设置。 此外,第3步也有一个警告。基于聚合标识符检索给定聚合的流非常快速/简洁,因为聚合通常没有很多事件。

但是,如果查询模型跨越多个聚合,则基于TrackingToken检索事件流可以确保您引入 entire 事件存储以实例化您的飞行中的模型。当然,您可以微调您希望事件流在处理TrackingToken时从中返回事件的时间点,但是更改非常高,您将不完整且相对较慢。

但是,您表示要检索给定聚合标识符的事件。 因此,我认为这在您的情况下应该是可行的解决方案。

希望这会有所帮助!