spring - 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
解决方案
完整答案在这里: https ://github.com/AxonFramework/AxonFramework/issues/1006
引用答案:
现在要解决您遇到的问题 - 您似乎想在应用程序启动时重置一些查询模型。但是,您在这种情况下遇到了配置顺序问题,其中 TrackingEventProcessor 尚未启动,而您创建的配置文件已经被调用。
请注意,我们计划在创建特定 bean 时更具体地确定顺序(如果您问我,可能会使用 Spring 应用程序事件) - 但是我们还没有,所以请耐心等待,直到执行此返工。
目前,您可以采取的最简单的方法是拥有专门的重播服务。您可以将此 ResetService/ReplayService 与 EventProcessingConfiguration 连接起来,并让它包含一个 void resetProjectors() 方法。我建议在您确定应用程序已完全连接的时间点调用此方法(例如通过处理一些 Spring 应用程序事件)。
再次感谢 Axon 开发团队。
推荐阅读
- api - React-Native Promise.all 和多个 API 请求
- c - 在 Dynamic 中使用指针将一个字符串复制到另一个字符串中
- netbeans - Netbeans 默认使用逗号。为什么?
- angular - 选项卡 Ionic 4 中的插槽绑定
- sql - 按数组聚合的列内的相等数据分组
- odbc - 从 Windows PC 访问 i 系列假脱机文件
- swift - 试图获取 2 个视图之一的 frame.height,它在 stackview 内同样填充
- c - `int main(i){ printf("i = %d\n", i); }` 我的值为 1。为什么?请解释?
- python - 在列表中添加某些元素
- python-3.x - 有没有一种简单的方法来压缩这段代码?