2017-04-06 11 views
2

私は数ミリ秒で送金をする佐賀を持っていると言います。私はSagaをトリガするコマンドを呼び出すRESTコントローラを持っています。コントローラが応答として返されるように、佐賀の終わりが結果や例外をチェックするのを待つ方法はありますか?それが単に佐賀を引き起こさない唯一のコマンドだったなら、コマンドゲートウェイとコールバックを使用して、成功または失敗を通知することができます。佐賀の結果や例外を待つ方法はありますか?

UPDATE:

1マイ)私のコントローラメソッドは、私がマップ

2に保存DeferredResultを返す):佐賀で終了した後

私は私のコントローラが応答を返す持ってすることができましたコントローラには、終了イベントをリッスンし、マップからDeferredResultを取得し、結果を設定するイベントハンドラがあります。

これについてもっと良い方法がありますか?

答えて

4

Axonは、さまざまなコンポーネントをデカップリングするように設計されています。一部のコンポーネントはコマンドを処理してイベントを生成し、他のコンポーネントはイベントを消費し、クエリモデルを更新します。また、Sagaの場合はコマンドを再度生成します。好ましくは、ユーザインタフェースは、この「最終的に一貫した」方法でも動作するように設計されるべきである。コマンドを送信するとき、戻り値はコマンドが正常に処理されたことを示しているだけで、すべての副作用が実行されたわけではありません。

誇張された例を使用する理由は簡単です。コマンドの結果として生成されたイベントに100のコンポーネントが関心がある場合はどうなりますか。これらの100のコンポーネントがすべて更新されるまで、コマンドハンドラをブロックしますか?これは、スケーラビリティに大きな影響を与えるこれらのコンポーネント間の劇的(技術的)な結合を引き起こすでしょう。

このバックグラウンドを考慮すると、読み込みモデルの変更に基づいてUIを更新する必要があります。すぐにいつでも特定の副作用が起きると予想される場合は、DeferredResultまたはCompletableFutureを使用することは非常にエレガントな方法です。基本的には、「あなたの現在の状態を教えてください」とは対照的に、「私にいつ知ってもらいましょう」と言っているクエリのスタイルです。 また、アップデートをコンシューマにリアルタイムでプッシュすることもできます。 Stomp(Spring Websocket)をベースにしたいくつかのプロジェクトでこれを実装しました。

は、彼らがタイムアウトした場合(DeferredResult.onTimeout()を参照してくださいにごマップから最終的にクリーン繰延結果に忘れてはいけません。あなたのマシンがあるため、過剰なメモリ消費のクラッシュした場合、それは残念だろう。洞察力のための

+0

感謝を! – sofiaguyang

関連する問題