我有以下设置:
commandGateway.sendAndWait(new C1(restPostBody));
将其转发到聚合。到目前为止,我可以看到以下选项:
使用视图投影仪,并投影新事件以创建视图模型,可以将其转发为REST调用中的响应。我在这里猜测,我需要使用queryGateway.subscriptionQuery(...
和sqr.updates().blockFirst()
来等待投影机处理事件,然后创建响应。另外,我猜这应该是同步的,因为如果系统在将事件存储到DB和将投影存储到DB之间失败,则投影可能会不同步?
从聚合发布事件后使用一些事件丰富器,并向其中添加所需的属性,并添加对REST调用的响应。这类似于Projection,但是在这种情况下,我不会将其保存到DB,因为只有我需要数据的时间是发出命令时对REST端点的响应。这应该是绝对同步的,因为如果出现故障,我将失去响应。在异步的情况下-我将需要让Aggregate处理重复的事件,并且仍然将事件发送给事件丰富器,但不存储到db。这似乎使事情变得很复杂。
是否有与此相关的最佳做法?
更新
我目前所拥有的是:
@Autowired
public void configure(EventProcessingConfigurer configurer){
configurer.usingSubscribingEventProcessors();
}
用于聚合和视图模型中的同步事件处理。然后,我可以使用查询模型(看起来有点难看-有更好的方法吗?)
try {
sc = queryGateway.query(new MyQuery("123", "123),
ResponseTypes.instanceOf(SomeView.class)).get();
}
catch (InterruptedException e) {
e.printStackTrace();
}
catch (ExecutionException e) {
e.printStackTrace();
}
我可以返回此SomeView
作为REST api上的响应。
答案 0 :(得分:1)
因此,@ bojanv55试图欺骗您的应用程序以使其成为同步设置,而Axon Framework的命令事件查询方法迫使您采用另一种方法。
理想情况下,您的前端应符合这种情况。 因此,如果您到达了发布命令的终点,那么您将大发雷霆而忘记了。更新查询模型的事件将在更新发生时被推送到前端。因此,不久之后,接受它是异步的事实,最终应该使一切都变得更加无缝。
但是,说起来容易做起来难;您问这个问题是有原因的。 我个人喜欢订阅查询(您也要指出)的用法,以欺骗操作使其变得同步。
我认为Frans的This存储库很好地展示了如何使用Axon Framework做到这一点。
他所做的是处理REST操作,然后 first 调度订阅查询,以了解您将很快更新的内容。 其次,将命令分派给聚合,聚合决定发布事件,然后事件更新查询模型。 然后,查询模型更新就构成了对订阅查询的更新,使您仅在实际调整查询模型后才返回结果。
最后,我总是会建议我的第一个建议,以接受您所处的异步情况。但是,第二,我认为我刚刚分享的订阅查询解决方案也可以解决您遇到的问题。>
希望这对您有所帮助!