问题描述
我想实现一个提供订阅查询的 Axon 投影。投影基于事件(CRUD)持久化特定实体。如果执行投影重放,应该会发生以下情况:
我的意图是订阅查询不应在很短的时间内通知许多事件,我想防止通知许多中间位置(例如,创建和删除特定实体,不应在订阅查询中使用,因为赶上之后就没有了)。
目前我无法实施第三步,因为我错过了对轴突投影再次赶上的时刻做出反应的钩子。
我使用 Axon v4.5 和 Spring Boot v2.4.5。
解决方法
目前,遗憾的是 Reference Guide 并没有非常具体地说明如何实现这一点。我可以向您保证,改进整个事件处理器部分的工作正在进行中,包括对重放过程和您拥有的钩子的更清晰的解释。
然而,可能的钩子是按原样说明的(你可以找到它们 here)。
要知道您的事件处理程序是否正在重播是/否,您可以使用 ReplayStatus
枚举。此枚举可用作 @EventHandler
注释方法的附加参数,仅包含两种状态:
REPLAY
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
,以便仅在事件处理程序执行常规事件处理过程时发出更新。