为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

叮当猫咪 2022-12-15 16:03:38
我通常每个聚合有 5-6 个事件,并且不想将预测存储在数据库中。在查询时始终进行视图投影的最简单方法是什么?
查看完整描述

1 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

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

但是,实施“在请求时重播给定事件”设置肯定是可行的。

我建议你做的事情分为几个步骤:

  1. 创建你想返回的查询模型,它可以处理事件@EventHandler在模型上使用带注释的方法)

  2. 创建一个组件,它可以处理将在第一步中返回查询模型的查询(为此使用带@QueryHandler注释的方法。

  3. 查询处理组件应该能够从EventStore. 如果这是基于aggregateIdentifier,请使用该EventStore#readEvents(String)方法。如果需要整个事件流,需要使用StreamableMessageSource#openStream(TrackingToken)方法(注:EventStore接口实现StreamableMessageSource

  4. 在处理查询时,创建一个AnnotationEventHandlerAdapter,给它一个新的查询模型实例

  5. 对于您在第 3 点中创建的事件流中的每个事件,调用该AnnotationEventHandlerAdapter#handle(EventMessage)方法。此方法将@EventHandler在您的查询模型对象上调用带注释的方法

  6. 如果流耗尽,您可以确保您的查询模型的所有必要事件都已处理。因此,您现在可以返回查询模型

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

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

但是,您声明要检索给定聚合标识符的事件。因此,我认为这在您的场景中应该是一个可行的解决方案。

希望这可以帮助!


查看完整回答
反对 回复 2022-12-15
  • 1 回答
  • 0 关注
  • 86 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信