(最初登录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();
});
}
}
这取自Replaying Events Documentation
启动应用程序时永远不会执行ifPresent内容,因此不会重置令牌。我可以通过删除令牌来手动强制事件的重播。上面提到的配置是我更改过的唯一配置,其他所有配置都在自动配置上运行。
令牌存储是Microsoft SQL Server,我能看到的所有交互似乎都很好(事件持续存在,当应用程序停止时令牌所有权会更新等)。
在运行时检查EventProcessingConfiguration时,eventProcessors属性为空,processingGroupAssignments属性也为空,这使我相信在运行Autowired配置后将处理ProcessingGroup批注,因此ifPresent将永远不会执行上面定义的代码。 / p>
版本信息:Spring Boot Starter:2.1.2,Axon Starter:4.0.3
答案 0 :(得分:1)
在此处完成答案: https://github.com/AxonFramework/AxonFramework/issues/1006
引用答案:
现在要解决您遇到的问题-似乎您想在应用程序启动时重置一些查询模型。但是,在这种情况下,您遇到了配置顺序问题,即尚未启动TrackingEventProcessor,而已经调用了您创建的配置文件。
请注意,我们已计划在创建特定bean时对订购进行更具体的安排(如果您要问我,可能与Spring应用程序事件有关)-但是我们还没有,所以请耐心等待,直到返工完成已执行。
目前,您可以采用的最简单方法是提供专用的重播服务。然后,您可以将此ResetService / ReplayService与EventProcessingConfiguration关联,并使其包含一个无效的resetProjectors()方法。我建议在确定应用程序已完全连接的时间点调用此方法(例如,通过处理一些Spring应用程序事件)。
再次感谢Axon开发团队。