2017-04-06 54 views
2

假設我有一個在幾毫秒內轉賬的傳奇。我有調用觸發佐賀的命令的REST控制器。我該如何等待傳奇的結尾來檢查結果或異常,讓我的控制器作爲迴應返回?如果它只是一個不會觸發傳奇的單獨命令,我可以使用命令網關和回調函數來通知我成功或失敗。有沒有辦法等待佐賀的結果或例外?

UPDATE:

我能夠有我的控制器返回響應佐賀通過結束後:

1)我的控制器方法返回DeferredResult我保存到地圖

2)我控制器有一個事件處理程序,用於偵聽結束事件,從地圖中檢索DeferredResult,並設置結果

有沒有更好的方法來解決這個問題?

回答

4

Axon旨在將不同組件分離。一些組件處理命令併產生事件,其他消耗事件並更新查詢模型,或者在傳奇的情況下,再次產生命令。

優選地,用戶界面應該被設計成也以這種「最終一致」的方式工作。發送命令時,返回值僅表示命令已成功處理,並非所有副作用都已執行。

使用誇張的例子時,原因很簡單:如果100個組件對作爲命令結果產生的事件感興趣,該怎麼辦?你想要你的命令處理程序阻塞,直到所有這100個組件都被更新了嗎?這會導致這些組件之間的戲劇性(技術)耦合,從而對可伸縮性產生巨大影響。

鑑於此背景,您可能仍然希望根據讀取模型的更改更新UI。如果你期望某個副作用很快會發生,使用DeferredResult或CompletableFuture是一個非常優雅的方法。這基本上是一種查詢方式,你會說:'讓我知道什麼時候...',而不是'給我你當前的狀態'。 或者,您也可以實時將更新推送給使用者。我們已經在基於Stomp的幾個項目(使用Spring Websockets)中實現了這一點。

不要忘記從你的地圖,最終乾淨遞延的結果,他們已超時的情況下(見DeferredResult.onTimeout()。這將是一個遺憾,如果你的機器崩潰,因爲過多的內存消耗。

+0

感謝您的見解! – sofiaguyang

相關問題