【问题标题】:Is there a hook for reacting to a catching up Axon projection?是否有一个钩子可以对追赶的轴突投射做出反应?
【发布时间】:2021-05-09 19:23:21
【问题描述】:

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

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

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

目前我无法实施第三步,因为我错过了一个钩子,用于对 Axon 投影再次赶上的那一刻做出反应。

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

【问题讨论】:

    标签: spring-boot axon


    【解决方案1】:

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

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

    1. REPLAY
    2. REGULAR

    此枚举允许在事件处理程序中使用条件逻辑来确定回放期间的操作。例如,如果一个事件处理程序不仅更新了投影,还发送了一封电子邮件,那么您需要确保在重播时不会再次发送电子邮件。

    要进一步阐明如何使用它,请考虑以下 sn-p:

    @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,仅在事件处理程序执行常规事件处理过程时发出更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 2020-12-04
      • 1970-01-01
      相关资源
      最近更新 更多