是否有一个钩子可以对追赶的 Axon 投影做出反应?

问题描述

我想实现一个提供订阅查询的 Axon 投影。投影基于事件(CRUD)持久化特定实体。如果执行投影重放,应该会发生以下情况:

  1. 通过订阅查询通知空集合。
  2. 处理事件直到投影赶上事件存储。
  3. 通过订阅查询通知实体的当前状态。

我的意图是订阅查询不应在很短的时间内通知许多事件,我想防止通知许多中间位置(例如,创建和删除特定实体,不应在订阅查询中使用,因为赶上之后就没有了)。

目前我无法实施第三步,因为我错过了对轴突投影再次赶上的时刻做出反应的钩子。

我使用 Axon v4.5 和 Spring Boot v2.4.5。

解决方法

目前,遗憾的是 Reference Guide 并没有非常具体地说明如何实现这一点。我可以向您保证,改进整个事件处理器部分的工作正在进行中,包括对重放过程和您拥有的钩子的更清晰的解释。

然而,可能的钩子是按原样说明的(你可以找到它们 here)。 要知道您的事件处理程序是否正在重播是/否,您可以使用 ReplayStatus 枚举。此枚举可用作 @EventHandler 注释方法的附加参数,仅包含两种状态:

  1. REPLAY
  2. REGULAR

此枚举允许事件处理程序中的条件逻辑在重播期间执行什么操作。例如,如果事件处理程序不仅更新投影还发送电子邮件,您需要确保在重播时不会再次发送电子邮件。

为了进一步阐明如何使用它,请考虑以下代码段:

@EventHandler
public void on(SomeEvent event,ReplayStatus replayStatus) {
    if (replayStatus == REGULAR) {
        // perform tasks that only may happen when the processor is not replaying
    }
    // perform tasks that can happen during regular processing and replaying
}

您可以在 if 块中调用 QueryUpdateEmitter,以便仅在事件处理程序执行常规事件处理过程时发出更新。