首页 > 解决方案 > Axon 4 - 配置注入时未检测到 ProcessingGroup 注释类

问题描述

(最初在 GitHub 上登录,但我想我会把它移到这里给任何有相同问题的人,并帮助开发团队将问题保留在同一个地方。)

我不确定这是我对框架的无知还是实际问题,请多多包涵,因为我在 Axon 4 上找到的关于事件重放的文档非常少。

设想:

@Component
@ProcessingGroup("projections")
public class AddEventHandler {

    @EventHandler
    public void on(AddEvent addEvent, ReplayStatus replayStatus){
    }

    @ResetHandler
    public void onReset() { // will be called before replay starts
        // do pre-reset logic, like clearing out the Projection table for a clean slate
       // this does not get executed
    }
}

@Configuration
public class AxonConfig {

    @Autowired
    private EventProcessingModule eventProcessingModule;

    @Autowired
    public void configureProcessors(EventProcessingConfiguration configuration) {
        configuration
                .eventProcessorByProcessingGroup("projections",
                        TrackingEventProcessor.class)
                .ifPresent(trackingEventProcessor -> {
                    trackingEventProcessor.shutDown();
                    trackingEventProcessor.resetTokens();
                    trackingEventProcessor.start();
                });
    }
}

这取自重播事件文档

ifPresent 内容在应用程序启动时永远不会执行,因此令牌永远不会重置。我可以通过删除令牌来手动强制重播事件。上面提到的配置是我唯一更改的配置,其他一切都在 AutoConfiguration 之外运行。

令牌存储是 Microsoft SQL Server,我可以看到的所有交互似乎都很好(事件被持久化,令牌所有权在应用程序停止时更新等)。

在运行时检查 EventProcessingConfiguration 时, eventProcessors 属性和 processingGroupAssignments 属性一样是空的,这让我相信在 Autowired 配置运行后处理了 ProcessingGroup 注释,因此 ifPresent 永远不会执行上面定义的代码。

版本信息:Spring Boot Starter:2.1.2,Axon Starter:4.0.3

标签: springspring-bootaxon

解决方案


完整答案在这里: https ://github.com/AxonFramework/AxonFramework/issues/1006

引用答案:

现在要解决您遇到的问题 - 您似乎想在应用程序启动时重置一些查询模型。但是,您在这种情况下遇到了配置顺序问题,其中 TrackingEventProcessor 尚未启动,而您创建的配置文件已经被调用。

请注意,我们计划在创建特定 bean 时更具体地确定顺序(如果您问我,可能会使用 Spring 应用程序事件) - 但是我们还没有,所以请耐心等待,直到执行此返工。

目前,您可以采取的最简单的方法是拥有专门的重播服务。您可以将此 ResetService/ReplayService 与 EventProcessingConfiguration 连接起来,并让它包含一个 void resetProjectors() 方法。我建议在您确定应用程序已完全连接的时间点调用此方法(例如通过处理一些 Spring 应用程序事件)。

再次感谢 Axon 开发团队。


推荐阅读