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