3

持続アクターの receive メソッドで、持続したいイベントを大量に受け取り、すべてのイベントが持続された後でのみ、状態を再度更新します。どうやってやるの?

def receive: Receive = {
  ...
  case NewEvents(events) =>
    persist(events) { singleEvent =>
      // Update state using this single event
    }
    // After every events are persisted, do one more thing
}

persist() 呼び出しはブロックされていないため、その直後にコードを配置できないことに注意してください。


更新: なぜこれが必要なのか

これらの新しいイベントは、外部 Web サービスから取得されます。私の永続的なアクターは、最後のイベント ID をその状態に保存する必要があります。これは、コマンドを受信したときに後続の ws 呼び出しに使用されます。問題は、これらのコマンドが同時に来る可能性があることです。そのため、ある種のロック システムが必要です。

  • 受信した ws call コマンド: このコマンドが終了するまで、次のコマンドを隠しておきます (つまり、ブール値)
  • ws から受信した応答: それらを保存し、状態を更新して最後の ID を保存し、隠し場所にあるすべてのコマンドに対して別の単一の ws 呼び出しを実行します (コマンドの送信者がそれらすべてに一度応答できるようにしています)それ以外の場合は、コマンドをもう隠しません。
4

1 に答える 1