【问题标题】:Axon Replay TrackingEvent related to some "aggregateIdentifier" using Axon 4Axon Replay TrackingEvent 与使用 Axon 4 的某些“aggregateIdentifier”相关
【发布时间】:2020-03-30 14:51:04
【问题描述】:

我们正在使用 Axon 4 使用 CQRS 和事件溯源。

我们有以下场景。

域书

  1. 操作 - 使用 Axon CRQS 和事件源流(命令 - 聚合 - 事件)将新书创建到数据库中
  2. 操作 - 使用 Axon CRQS 和事件源流(命令 - 聚合 - 事件)将已创建的 Book 更新到 DB 中
  3. 在 Axon 事件存储中,上面解释的这两个命令(createCommand 和 updateCommand)具有相同的“aggregateIdentifier”ID,它们位于同一个聚合树中,因为我们正在处理同一个聚合根。
  4. 在 Axon 事件存储中,此命令具有不同的“aggregateSequenceNumber”,这也是正常的和预期的

此时我们正在通过 processingGroup 重播事件,这工作正常,现在我们想要对事件进行更复杂的重播

问题

我们如何创建仅重放具有某些“aggregateIdentifier”ID(一个聚合树)的事件的resetTokens,这意味着我们只想重播与某本书(聚合树)相关的事件而不是所有书籍?

Axon 4 是否支持此功能?

【问题讨论】:

  • 我不明白这一点。为什么要仅重播某些聚合的事件?
  • 场景 我们有包含 10 000 条记录的表格簿(这些记录是由事件存储中存在的命令创建的)。我们只想重播标题为“Java”的书的事件,我们想查看标题为“Java”的书是如何更新的以及使用了哪些命令,因为一些用户报告了此记录的问题

标签: java cqrs event-sourcing axon


【解决方案1】:

如果您愿意,您可以使用 Axon 创建此功能,但它需要一些使用 Axon 框架细节的自定义代码。

首先,这不是重播,因为重播是从事件处理器级别描述的。重放事件处理器将根据给定的令牌从某个时间点开始读取整个事件流。

您想要的是重放过滤给定的聚合标识符。

从您评论中的描述来看,这感觉就像用户/服务对您的应用程序执行的零星查询。

处理此查询后,您需要打开一个事件流,过滤事件,然后使用剩余的流来更新所需的查询模型。

从实现的角度来看,我会使用AnnotationEventHandlerAdapter。应该给这个类一个annotated event listener,它应该是你想要创建并返回的查询模型。

随后,应使用过滤后的事件流调用 AnnotationEventHandlerAdapter#handle(EventMessage<?>) 方法。到达流的末尾后,您的查询模型就是最新的。

所以,回到你的问题:

Axon 4 是否支持此功能?

这个问题的答案是肯定的,但是这需要你做一些方便的工作。

【讨论】:

  • 谢谢 Steven,我会看看你的 cmets 并尝试按照你的指导实现功能
  • 这个@Mr.Java 有什么更新吗?我可以得到一些示例代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多