我正在实现一个spring-boot和axon的例子。我有两个事件(存入和提取帐户余额)。我想知道有没有办法在给定日期之前获得帐户汇总的状态?我不仅想要得到最终状态,还想要在一系列日期内重播事件。
发布于 2019-05-10 17:30:53
我想我能帮上忙。
在Axon Framework的上下文中,您可以通过告诉给定的TrackingEventProcessor“重置”它的令牌来开始事件的重播。顺便说一下,参考指南中对此的最新描述可以在here中找到。
这些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设置中的命令模型,从而处理进入系统的命令。在大多数应用程序中,您希望命令(例如,更改某些内容的请求)发生在应用程序的current状态上。因此,提供用于检索聚合的Repository不允许指定时间点。
因此,上述关于重放的解决方案仅与查询模型创建相关,因为TrackingEventProcessor是应用程序中最常用于创建视图的事件处理端的一部分。这个想法也与您的问题联系在一起,即您想知道给定时间点的“帐户聚合状态”。这不是一个命令,而是一个查询,因为你有一个“数据请求”,而不是“更改状态的请求”。
希望这篇文章能帮到你@Safe!
https://stackoverflow.com/questions/56074332
复制相似问题