我正在实现弹簧靴和轴突的示例。我有两个事件(存入和提取帐户余额(。我想知道有什么方法可以在给定日期之前将帐户状态汇总?我不仅要获得最终状态,而且要在一系列日期中重播事件。
我想我可以为此提供帮助。
在轴突框架的上下文中,您可以通过告诉给定的TrackingEventProcessor
"重置"它是令牌来开始事件的重播。顺便说一句,可以在此处找到参考指南中的当前描述。
这些TrackingTokens
是知道给定TrackingEventProcessor
在处理事件流的事件方面有多远的对象。因此,重置/调整这些TrackingTokens
是会发出事件的重播。
知道所有这些,第二步是查看TrackingEventProcessor
提供给"重置令牌"的方法,这是三倍:
-
TrackingEventProcessor#resetTokens()
-
TrackingEventProcessor#resetTokens(Function<StreamableMessageSource, TrackingToken>)
-
TrackingEventProcessor#resetTokens(TrackingToken)
选项一个人将使您的令牌重置为事件流的开头,从而重播所有内容。选项第二和第三,但是让您有机会提供TrackingToken
。
因此,您可以从事件流上的几个点开始提供TrackingToken
。那么,您如何在特定时间点创建这样的TrackingToken
?为此,您应该查看具有以下操作的StreamableMessageSource
接口:
-
StreamableMessageSource#createTailToken()
-
StreamableMessageSource#createHeadToken()
-
StreamableMessageSource#createTokenAt(Instant)
-
StreamableMessageSource#createTokenSince(Duration)
选项1是在流开始时创建令牌的,而2将在流的头部创建一个令牌。
选项3和4将允许您在特定时间点创建令牌,从而使您可以重播所有事件,因为已定义的实例到现在为止。
但是,在这种情况下有一个警告。您要重播总体。从Axon的角度来看,默认情况下,汇总是设置CQRS中的命令模型,因此处理进入系统的命令。在大多数应用程序中,您需要在应用程序的当前状态上发生命令(例如,更改某些内容的请求(。因此,提供的Repository
用于检索聚合物不允许指定时间点。
因此,以上所述的重播解决方案仅与查询模型的创建有关,因为TrackingEventProcessor
是您应用程序中事件处理方面的一部分,最常用于创建视图。这个想法也与您的问题联系在一起,您想在给定的时间点了解"汇总状态"。那不是命令,而是a query ,因为您有" data请求"而不是"更改状态的请求"。
希望这可以帮助您@SAFE!