问题描述
我有2个spring-boot服务,分别充当命令和查询,如下所示。
请注意,这两个服务都共享相同的轴突服务器实例和相同的数据库(在本例中为ElsaticSearch)。
我的UI的设计方式是,当用户提交表单以创建数据时,会发生ajax调用,该调用依次按以下顺序执行2个rest调用:
- 第一个调用是一个发布请求,该请求转到Command-Service,执行以下操作:
- 使用formdata创建一个CreateDataCommand对象,并执行以下操作:
org.axonframework.commandhandling.gateway.CommandGateway.sendAndWait(CreateDataCommand);
- CreateDataCommand是在触发DataCreatedEvent的聚合中处理的:
@CommandHandler private DataAggregate(CreateDataCommand createDataCommand ) { AggregateLifecycle.apply(new DataCreatedEvent ()); }
- DataCreatedEvent在2个地方处理,
- 在聚合本身中,聚合更新其状态:
@EventSourcingHandler private void on(AppCreatedEvent appCreatedEvent) { // updated aggregate's state }
- 在Projection中,它将数据保存到数据库中。
@EventHandler private void on(AppCreatedEvent appCreatedEvent) { // Saves data to database. }
- 成功执行以上操作后,ajax会立即向Query-Service发送一个get请求,该请求将执行以下操作:
- 触发GetDataQuery查询,如下所示:
org.axonframework.queryhandling.QueryGateway.query(GetDataQuery,ResponseType);
- GetDataQuery的处理方式如下:
@QueryHandler List<Data> getData(GetDataQuery getDataQuery){ // hits the databse and returns data. }
- 触发GetDataQuery查询,如下所示:
问题: 即使通过Command-Service将数据保存到数据库中,也会触发对Query-Service的调用,并且该调用始终返回空列表。在第二次调用之后,它将返回正确的数据。之所以发生这种情况是因为Query-Service在Command-Service完成在数据库中的数据创建之前就已经命中数据库。
ajax脚本:
$.ajax({
type: "POST",url: "directs to Command-Service to save data",data: formData,contentType: false,processData: false,cache: false,timeout: 60000,enctype: "multipart/form-data",success: data => {
setTimeout(() => location.replace("url of query-service"),1000);
}
});
有人可以帮我实现完全一致性,还是找到一种方法来消除由于上述现象而引起的不一致。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)