7

データをデータベースに保存しようとしています。私のpersistメソッドは非同期です。Akka俳優の受信メソッド内で非同期呼び出しを処理する最良の方法

class MyActor(persistenceFactory:PersistenceFactory) extends Actor { 
    def receive: Receive = { 
    case record: Record => 
     // this method is asynchronous, immediate return Future[Int] 
     persistenceFactory.persist(record) 
    } 
} 

負荷が高い状態でアプリケーションを実行するとボトルネックが発生するか、スレッドが使用できなくなります。

したがって、Akkaアクタのreceiveメソッド内で非同期呼び出しを処理する最良の方法は何ですか?

+0

何がしているのですか?それは暗黙の 'ExecutionContext'を受け入れますか? –

+0

いいえ、独自のExecutionContextを持っています。 – Sky

+0

どのように 'ExecutionContext'を作成しますか?コードを表示できますか? –

答えて

1

これは、アクターが相互作用を処理するために別のアクターを作成する必要がある場合の素晴らしい例です。基本的にはこのような流れで、FSM(有限状態マシン)を使うと簡単に使えます。

  1. 親の俳優は、メッセージ
  2. 親俳優は子トランザクションの俳優
  3. は親が変更に)元のメッセージ
  4. 子供が将来
  5. 子供が(になる使用非同期メソッドを格納呼び出す子を送り作成受けます将来の完了を待つ行動。これを行うには、FSMを含むいくつかの方法があります。それが完了した場合には、将来をチェックする
  6. 子供schedules periodic messages to itself
  7. 子供の新しい動作は、それぞれが(将来が完了すると
  8. は、子供が親にまたは元の送信者に結果を返信することができます受信に将来をチェックします親がメッセージを元の送信者と一致させた場合)。
+0

おそらく、結果を子アクターに送る未来への 'onComplete'コールバックを登録することができます。 –

+0

確かに、私はスカラ未来またはJava 8完了可能な未来のJavaではないと思っていました。コールバックには面があります。将来のエグゼキュータに何らかの事態が発生した場合に備えて、子供にタイムアウトメッセージを送信させたい場合もあります。 – dres

関連する問題