Spring Axon 4-配置注入时未检测到ProcessingGroup注释类

Spring Axon 4-配置注入时未检测到ProcessingGroup注释类,spring,spring-boot,axon,Spring,Spring Boot,Axon,(最初登录到GitHub,但我想我会将它移到这里,让所有有相同问题的人都可以使用,并帮助开发团队将问题保留在同一位置。) 我不确定这是我对框架的无知还是一个实际的问题,请容忍我,因为我已经能够找到关于Axon 4事件回放的很少文档 情景: @Component @ProcessingGroup("projections") public class AddEventHandler { @EventHandler public void on(AddEvent addEvent,

(最初登录到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内容,因此永远不会重置令牌。我可以通过删除令牌手动强制重播事件。上面提到的配置是我唯一更改的配置,其他所有配置都在自动配置下运行

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

在运行时检查EventProcessingConfiguration时,eventProcessors属性与processingGroupAssignments属性一样为空,这使我相信ProcessingGroup注释是在自动连线配置运行后处理的,因此ifPresent将永远不会执行上面定义的代码

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

引述的答覆:

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

请注意,我们计划在创建特定bean时更具体地进行订购(如果您要求我的话,可能会使用Spring应用程序事件)-但是我们还没有,所以在执行此返工之前请耐心等待

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


再次感谢Axon开发团队。

Kenneth也在这里分享了这些好东西!