识别并重新运行 Axon 中的特定事件

Identify and Rerun particular events in Axon

我们正在研究从轴突中重新运行精心挑选的事件。用例如下所示。

如果用户的注册事件失败,即使命令成功,我们想要为特定事件处理程序重新运行该特定事件。

我们考虑使用跟踪事件处理器,但这似乎是从特定时间点重播一组事件。但是,在我们的例子中,如果昨天有 100 个事件,我们只想在中间重新运行一个特定的事件。

目前我们正在迁移到 Axon,因此我们决定主要使用 SubscriptionEventProcessors,因为它更同步(即错误会向上传播到命令处理程序)。我们知道订阅处理器是无状态的,因为它们只处理通过事件总线接收到的内容。

所以我假设我们不能使用跟踪处理器?相反,我们需要加载特定事件并将其重新推送到事件总线?

我们怎样才能做到这一点? (有无以上建议)

此外,关于识别异常,我们正在考虑使用方面和日志记录,并阅读特定的日志行以查找异常。然而,我们确实注意到了轴突和 spring 引导的跟踪模块。 https://github.com/AxonFramework/extension-tracing 但是据说它处于测试阶段,我们也找不到太多参考文档。还有更好的基于轴突的解决方案吗?

为了快速解决这个问题,我会使用与我在 this 问题上发布的类似的回复。

快速复述我那边的回复,可以总结为: 创建一个查询模型,其中包含 "re-handle" 所需的 @EventHandler 注释方法,您可以将其作为输入提供给 Axon 的 AnnotationEventHandlerAdapter 构造函数。您将根据您的要求使用过滤后的事件流调用后续的 AnnotationEventHandlerAdapter。因此,查询模型将更新为您需要的格式。

因此,您不会因为用户需要该信息而将其作为一种查询形式来执行,而是在特殊情况下执行该操作。无论如何,您仍然会重新构建查询模型,但只是基于一组特定的事件。

顺便一提,在事件处理器的选择上,我还是会选择TrackingEventProcessor。是的,这意味着事件失败不会发出回滚,但本质上事件表明它已经发生。因此,因为其他事情处理该事件失败而回滚是不正确的;命令仍然成功,所以它也应该保持原样。

最后,您正在寻找日志记录逻辑。您共享的跟踪扩展最近刚刚退出测试状态,因此可以安全使用。接下来,可以通过将 LoggingInterceptor 配置为 MessageHandlerInterceptorMessageDispatchInterceptor 来实现基本日志记录(有关这方面的文档可以在 here). And if you are looking to introduce Aspect logic: Axon has a similar mechanism to tie into each message handler out there. Have a look at the HandlerEnhancer/HandlerEnhancerDefintion on this 页面找到。

希望这一切对您有所帮助@MilindaD!