我通常每汇总有5-6个事件,并且不想将投影存储在DB中。在查询时间进行视图投影的最简单方法是什么?
对此的简短答案是,没有简单/快速的方法。
但是,最肯定的是实现"在请求时间重播给定的事件"。
我建议您做的几个步骤存在:
- 创建您要返回的查询模型,该模型可以处理事件(在模型上使用
@EventHandler
注释方法( - 创建一个可以处理可以返回查询模型的查询的组件(对此使用
@QueryHandler
注释方法。 - 查询处理组件应该能够从
EventStore
检索事件。如果基于aggregateIdentifier
,请使用EventStore#readEvents(String)
方法。如果需要整个事件流,则需要使用StreamableMessageSource#openStream(TrackingToken)
方法(注意:EventStore
接口实现StreamableMessageSource
( - 在查询处理时,创建一个
AnnotationEventHandlerAdapter
,为其提供了查询模型的新实例 - 对于您在第3点创建的事件流中的每个事件,请致电
AnnotationEventHandlerAdapter#handle(EventMessage)
方法。此方法将在查询模型对象上调用@EventHandler
注释方法 - 如果流耗尽,请确保您的查询模型所处理的所有必要事件。因此,您现在可以返回查询模型
因此,我再次认为这不是过于琐碎,容易或快速设置。此外,步骤3在那里有一个警告。基于汇总标识符检索给定聚合的流非常快/简洁,因为通常没有很多事件。
但是,根据TrackingToken
检索事件流,如果查询型号跨越了几个聚合,则可以确保您将整个全事件存储插入即时实例化模型。当然,您可以在处理TrackingToken
时将事件流返回事件的时间点,但是更改很高,您将不完整且相对较慢。
但是,您说您想为给定的汇总标识符检索事件。因此,我认为这应该是您方案中的一个可行解决方案。
希望这会有所帮助!