有什么办法可以重播日期范围内的事件?

时间:2019-05-10 09:11:29

标签: spring-boot event-driven axon

我正在实现spring-boot和axon的示例。我有两个事件 (存入和提取帐户余额)。我想知道是否有任何方法可以在给定日期之前获取“帐户汇总”的状态? 我不仅要获得最终状态,还要重播一系列日期中的事件。

1 个答案:

答案 0 :(得分:1)

我想我可以帮忙。

在Axon Framework的上下文中,您可以通过告诉给定的TrackingEventProcessor“重置”它的令牌来开始事件的重播。顺便说一句,可以在here中找到《参考指南》中对此的当前描述。

这些TrackingTokens是了解给定TrackingEventProcessor在处理事件流中的事件方面有多远的对象。因此,重置/调整这些TrackingTokens会发出事件重播。

了解了所有这些,第二步是查看TrackingEventProcessor提供的“重置令牌”方法,该方法有三方面:

  1. TrackingEventProcessor#resetTokens()
  2. TrackingEventProcessor#resetTokens(Function<StreamableMessageSource, TrackingToken>)
  3. TrackingEventProcessor#resetTokens(TrackingToken)

选项1会将您的令牌重置为事件流的开始,从而重播所有内容。 但是,选项2和3使您有机会提供TrackingToken

因此,您可以从事件流的多个点开始提供TrackingToken。那么,您如何在特定的时间点创建这样的TrackingToken?为此,您应该看看StreamableMessageSource界面,该界面具有以下操作:

  1. StreamableMessageSource#createTailToken()
  2. StreamableMessageSource#createHeadToken()
  3. StreamableMessageSource#createTokenAt(Instant)
  4. StreamableMessageSource#createTokenSince(Duration)

选项1用于在流的开头创建令牌,而选项2将在流的开头创建令牌。

但是,选项3和4将允许您在特定的时间点创建令牌,从而使您可以重播自定义实例至今的所有事件。

在这种情况下有一个警告。您要重播聚合。从Axon的角度来看,默认情况下,聚合是CQRS设置中的命令模型,因此处理进入系统的命令。在大多数应用程序中,您希望在应用程序的当前状态下执行命令(例如,更改某些内容的请求)。因此,提供的Repository用来检索聚合数据不允许指定时间点。

因此,上述有关重播的解决方案仅与查询模型创建相关,因为TrackingEventProcessor是应用程序中事件处理方面的一部分,是最常用于创建视图的部分。这个想法也与您的问题有关,即您想在给定的时间点知道“帐户汇总状态”。那不是一个命令,而是一个查询,因为您有一个“数据请求”,而不是“状态更改请求”。

希望这可以帮助您@Safe!