技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

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でも見た記憶がある。