2017-02-14 1 views
0

私が初めてLagom + CQRS /イベントソーシングに近づいていると私は同じような動作を実装したいと思います:Lagomで「期限切れ」の副作用を実装する方法は?

  1. サービスコールが(REST APIコール経由など)が実行される
  2. Aコマンドが実行され、状態を変更するイベントがトリガーされます(たとえば、何らかのタイマーが開始されます)。
  3. あらかじめ定義された間隔の後、タイマーは期限が切れるので、タイマーを無効にするために状態を変更するために新しいイベントをトリガーする必要があります(他の外部コマンドなし)。

最初の2つのステップは簡単ですが、一度TimerStartedEventをトリガーして状態を変更すると、一定の時間が経過した後にイベントを「スケジュール」するにはどうすればよいですか? 3番目のステップはどのように実装しますか?

+0

私は個人的にLagomに精通していませんが、あなたのタグにAkkaを記載して以来、あなたの状況に該当する場合、アクタスケジューラにあなたの俳優にタイムアウトメッセージをスケジュールするよう提案します。 これは私が過去に作ったジョブオーケストレーションアプリケーションで、これは動作が似ています:REST APIを呼び出すと、REST APIが完了すると完了アクションがトリガーされるが、同時にRESTコールはAkkaスケジューラタイムアウトメッセージをスケジュールする。どちらが最初にターゲットアクタに来るかは、そのコールが終了した方法を定義しました – MattEdge

+0

@MattEdgeこれは良い考えです! LagomはAkkaの上に構築されているので、私はそれを私のタグにリストアップしました。唯一の「欠点」は、この外部サービスがタイムアウトを伝えるために第1サービスにいくつかのAPIを呼び出す必要があることです。したがって、CQRSの用語では、状態を変更するイベントをトリガするコマンドを実行する必要があります。それは "正しい"か、外部からの特定のコマンドなしにイベントを生成する必要がありますか? –

+0

結果がREST API経由で関連付けられたActorにルーティングされた後、イベントが内部的に生成されました。しかしタイムアウトが最初に発生した場合、アクタは終了し、APIは適切なアクタにクエリを実行できませんでした(トラッキング目的でログアウトしました)。 – MattEdge

答えて

0

実際にはonline-auction-scala sample codeに実装されています。

LagomはAkkaの上に構築されているため、ActorSystemを注入するので、system.scheduler.scheduleコールを使用して今後何かをスケジュールすることができます。

system.scheduler.scheduler(offset, delay) { 
    checkFinishBidding() 
} 

checkFinishBidding() = { 
    registry.refFor[Entity](id).ask(SomeCommand) 
} 

だから時間の火災は、レジストリからエンティティー参照をデキューし、普通のようにコマンドを実行することができます。

質問のCQRS部分に答えるために、サンプル・コードは次のように行いますサービスコール。

+0

これは良い解決策ですが、注意すべき点が1つあります。オンラインオークションアプリのサンプルコードはまだクラスタ対応ではありません。つまり、複数のノードでサービスを実行すると(復元性のために推奨されます)、スケジュールされたタスクはすべてのノードで実行されます。これを避けるために、Akka [Cluster Singleton](http://doc.akka.io/docs/akka/2.4/scala/cluster-singleton.html)を使用することができます。 –

+0

また、もしあなたがそれに満足しているなら、あなた自身の答えを受け入れることができると思います:) –

関連する問題