有没有办法等待 Saga 的结果或异常?
Is there a way to wait for the results or exceptions of a Saga?
假设我有一个可以在几毫秒内完成汇款的 Saga。我有 REST 控制器,它调用触发 Saga 的命令。如何等待 Saga 结束检查结果或异常,让我的控制器 return 作为响应?如果它只是一个不会触发 Saga 的单独命令,我可以使用一个命令网关和一个回调来通知我成功或失败。
更新:
我能够让我的控制器 return 在 Saga 结束后做出响应:
1) 我的控制器方法 return 是我保存到地图中的 DeferredResult
2) 我的控制器有一个事件处理程序,它侦听结束事件,从地图中检索 DeferredResult,并设置结果
有没有更好的方法来解决这个问题?
Axon 旨在解耦不同的组件。一些组件处理命令并产生事件,其他组件使用事件并更新查询模型,或者在 Saga 的情况下,再次产生命令。
最好将用户界面设计为也以这种 'eventually consistent' 方式工作。发送命令时,return值只是表示命令处理成功,并不表示所有副作用都已执行。
使用一个夸张的例子,原因很简单:如果 100 个组件对作为命令结果产生的事件感兴趣怎么办。您是否希望您的命令处理程序阻塞,直到所有这 100 个组件都已更新?这将导致这些组件之间发生显着(技术)耦合,并对可伸缩性产生巨大影响。
鉴于该背景,您可能仍希望根据读取模型的变化更新 UI。如果您预计某种副作用很快就会发生,那么使用 DeferredResult 或 CompletableFuture 是一种非常优雅的方式。它基本上是一种查询风格,您可以在其中说:'let me know when ...',而不是 'give me your current state'。
或者,您也可以将更新实时推送给消费者。我们已经在几个基于 Stomp 的项目中实现了这一点(使用 Spring Websockets)。
不要忘记最终从您的地图中清除延迟结果,以防它们超时(参见 DeferredResult.onTimeout()
。如果您的机器因内存消耗过多而崩溃,那将是一种遗憾。
假设我有一个可以在几毫秒内完成汇款的 Saga。我有 REST 控制器,它调用触发 Saga 的命令。如何等待 Saga 结束检查结果或异常,让我的控制器 return 作为响应?如果它只是一个不会触发 Saga 的单独命令,我可以使用一个命令网关和一个回调来通知我成功或失败。
更新:
我能够让我的控制器 return 在 Saga 结束后做出响应:
1) 我的控制器方法 return 是我保存到地图中的 DeferredResult
2) 我的控制器有一个事件处理程序,它侦听结束事件,从地图中检索 DeferredResult,并设置结果
有没有更好的方法来解决这个问题?
Axon 旨在解耦不同的组件。一些组件处理命令并产生事件,其他组件使用事件并更新查询模型,或者在 Saga 的情况下,再次产生命令。
最好将用户界面设计为也以这种 'eventually consistent' 方式工作。发送命令时,return值只是表示命令处理成功,并不表示所有副作用都已执行。
使用一个夸张的例子,原因很简单:如果 100 个组件对作为命令结果产生的事件感兴趣怎么办。您是否希望您的命令处理程序阻塞,直到所有这 100 个组件都已更新?这将导致这些组件之间发生显着(技术)耦合,并对可伸缩性产生巨大影响。
鉴于该背景,您可能仍希望根据读取模型的变化更新 UI。如果您预计某种副作用很快就会发生,那么使用 DeferredResult 或 CompletableFuture 是一种非常优雅的方式。它基本上是一种查询风格,您可以在其中说:'let me know when ...',而不是 'give me your current state'。 或者,您也可以将更新实时推送给消费者。我们已经在几个基于 Stomp 的项目中实现了这一点(使用 Spring Websockets)。
不要忘记最终从您的地图中清除延迟结果,以防它们超时(参见 DeferredResult.onTimeout()
。如果您的机器因内存消耗过多而崩溃,那将是一种遗憾。