访问Axon中的所有历史事件

问题描述

我正在尝试使用Axon Framewok构建服务,该服务将生成由域事件触发的时间序列数据,但是,它需要访问历史域事件以重新构建完整图片

可能的域事件可能是CreateTimeseriesModifyTimeseriesEndTimeseries事件将提供生成最终时间序列所需的所有输入。

带有数据的示例模型可能看起来像这样

CreateTimeseries { 
   min:0
   max: 0
   from: 2020-01-01
}
  
UpdateTimeseries {
    from: 2020-01-03
    to: 2020-01-05
    value: 20
}

UpdateTimeseries {
    from: 2020-01-22
    to: 2020-01-24
    value: 11
}

在这种情况下,我有一个CreateTimeseries事件和几个ModifyTimeseries事件,它们按顺序(基于某些事件的创建)应用了需要应用于时间序列模型的更改时间戳)。

要通过Axon框架实现此目的,“最佳实践”方法是在聚合内实现所有生成逻辑,因为聚合可以访问以前的所有域事件吗?

作为Aggregate的替代方法,有没有一种方法可以让我的事件处理程序对新事件做出反应,例如一个新的TimeseriesUpdatedEvent,但是以某种方式可以访问生成时间序列所需的所有先前事件?

解决方法

让我提前@vcetinick:我不认为这会立即以聚合/命令模型的形式出现。 我这样做的理由是基于思考TimeSeriesCreated / TimeSeriesUpdated事件的来源。哪个对象/模型负责确定是否已发生?鉴于您当前的域描述,不确定此类聚合将执行什么操作或进行哪种业务验证。

已添加,我想警告您转移到类似于基本CRUD操作的事件表单。创建的事件是您可能会在所有场景中看到的,虽然已更改为注册,构建,构造等,但在所有情况下都可能会发生。但是更新事件表明您的模型发生了非常普通的变化,这可能意味着任何事情。您将失去该事件可以准确地描述发生了什么的功能。因此,如果可能的话,建议您发布更多特定的事件,以便事件处理程序能够更具体地做出反应。

说了这么多,当涉及到对这样的事件做出反应以构建“时间序列”模型时,我将其放入具有@EventHandler批注方法的专用组件中,以更新所述模型。现在,显然在处理特定类型的事件时,需要追溯处理事件。

最好将其放在常规的事件处理组件中(这样的类中带有@EventHandler注释函数)。在我看来,如何起草这个时间序列模型,可以从两个方向解决:

  1. 为此模型使用时间序列数据库,因为这样就可以立即使用它。
  2. 进行临时事件存储查询以在处理特定事件时检索其他事件。

选项1实际上归结为选择您当然想要的时间序列数据库。并且,在那里起草实际的查询模型。

选项二归结为在应用程序中使用一些其他Axon Framework组件。如果您想手动读取事件,只需在事件处理组件中连接EventStore,即可基于给定的aggregateIdentifier或整个{ {1}}(在Axon中定义为EventStore)。

通过将时间序列模型(确切的类)包装在TrackingToken中,可以使这一步骤更进一步。这是最后一个组件,它使您可以调用SimpleEventHandlerInvoker方法,以便可以在handle(EventMessage)上检索到的事件集上进行流式传输。

希望这可以帮助您进一步@vcetinick!