假设我有一个Saga在几毫秒内进行汇款。我有REST控制器,它调用触发Saga的命令。我如何等待Saga的结束检查结果或异常让我的控制器作为响应返回?如果它只是一个不会触发Saga的单独命令,我可以使用命令网关和回调来通知我成功或失败。
更新:
我可以让我的控制器在Saga结束后返回一个响应:
1)我的控制器方法返回一个DeferredResult,我将其保存到地图
中2)我的控制器有一个事件处理程序,它监听结束事件,从地图中检索DeferredResult,并设置结果
有没有更好的方法来解决这个问题?
答案 0 :(得分:5)
Axon旨在解耦不同的组件。一些组件处理命令并生成事件,其他消耗事件和更新查询模型,或者在Saga的情况下,再次生成命令。
优选地,用户界面应该被设计成也以这种“最终一致”的方式工作。发送命令时,返回值只表示命令已成功处理,而不是所有副作用都已执行。
使用夸大的示例时,原因很简单:如果100个组件对作为命令产生的事件感兴趣,该怎么办?您是否希望阻止命令处理程序直到所有这100个组件都已更新?这将导致这些组件之间的显着(技术)耦合,从而对可伸缩性产生巨大影响。
鉴于该背景,您可能仍希望根据读取模型的更改来更新UI。如果您希望很快就会发生某种副作用,那么使用DeferredResult或CompletableFuture是一种非常优雅的方式。这基本上是一种查询方式,你说:“让我知道什么时候......”,而不是“给我你现在的状态”。 或者,您也可以实时向消费者推送更新。我们已经在几个基于Stomp(使用Spring Websockets)的项目中实现了这一点。
不要忘记最终清理地图上的延迟结果,以防它们超时(参见collection_select
。如果你的机器由于过多的内存消耗而崩溃将会很可惜。