Akkaの勉強をやってみる3
始めに断わっておきますが英語圏のネイティブじゃないんでドキュメント読んで拾った内容だけど間違ってるかもしれない。
Akka は動作階層を持っているらしい。
- ActorRef
- MessageDispatcher
- MailBox(with MessageQueue)
- Actor(プログラマが実際に処理を記述するActorのロジック)
これらの制御にプログラマから二つの口が存在している。
- Props : ActorRef, MessageDispatcher の設定、実行するActor本体の初期化(もしくは初期化関数の適時実行)
- Config : MessageDispatcher, MailBox, MessageQueue の動作設定
で、処理フローとしては基本、
- ActorRef でプログラムコードからのメッセージを受ける(Actor 起動の為のIF)
- ActorRef が MessageDispatcher へメッセージを送る
- MessageDispatcher が MessageQueue へメッセージを格納する
- MessageDispatcher が MailBox にメッセージが届いたことを通知する
- MailBox が MessageQueue からメッセージを引っ張り出す
- MailBox が Actor を invoke する
たとえば、設定次第では、Queue/MailBox/Actor を複数並列でメモリに配置して、同じく並列に実行させることもできるらしい。
また、Actor には ask 実行ができ、Actorの呼び出し元スレッドで結果を成功/失敗の形式で拾えるとのこと。
import akka.pattern.ask import scala.concurrent.duration._ implicit val timeout = Timeout(2 seconds) implicit val ec = system.dispatcher val actor = system.actorOf(Props[TargetActor], "sample1") val future = actor.ask("some message") future.onComplete { case Failure(_) => // 失敗通知 case Success(msg) => // 成功通知 }
ああ、Future 型はscala.Actorでも見た記憶がある。