成らぬは人の為さぬなりけり

エンジニアライフをエンジョイする為のブログ

Scala勉強日誌 - Akka その3 application.conf使ってみる

さてさて、続けてその3です。

前回からの続きで、AkkaActorの話です。

今日のテーマ

  • configファイルを使ってみる

環境

  • MacOSX 10.9.4
  • Scala 2.11.1
  • sbt 0.13.5
  • akka-actor 2.3.4

参考

Scala - Configuration for Akka application - Qiita

Configuration — Akka Documentation

configファイルを使ってみる

クラスパスから自動的に探してくれるようなので、ルートにapplication.confを作ります。 前回使ったサンプルのRouterの定義をconfigに移してみたいと思います。

akka.actor.deployment {
  /routerTest {
    router = round-robin-pool
    nr-of-instances = 2
  }
}

(IntelliJIDEAでシンタックスハイライトしてくれないかなぁ...)

  • routerTestという名前をつけました
  • routerはとりあえず前回と同じRoundRobinPoolになるように
  • nr-of-instancesはRoundRobinPoolの引数に渡す、Pool数(?)
    • number of children to create in case of a routerと書いてあったので、childrenの数ですかね

では、これを使うコードを書いてみます。

object AkkaExample04 extends App {
  val system = ActorSystem()
  val actor = system.actorOf(Props[WeatherApi].withRouter(FromConfig), "routerTest")
  implicit val timeout = Timeout(10.seconds)

  val f1 = (actor ? 1)
  val f2 = (actor ? 2)
  val f3 = (actor ? 3)

  for {
    first <- f1
    second <- f2
    third <- f3
  } yield {
    println("yeild!!")
    (first, second, third) match {
      case ((i, json1), (j, json2), (k, json3)) => print("complete")
    }
    system.shutdown
  }
  println("ここはどこ")
}

ポイントは

  val actor = system.actorOf(Props[WeatherApi].withRouter(FromConfig), "routerTest")

ここです。(今回はファイル名をapplication.confにしているので、特に設定ファイルパスの指定は不要ですが、変える場合は必要なのかな?多分)

  • withRouter(FromConfig)
    • Router設定を設定ファイルから読み込んでくれます
  • "roundRobinTest"
    • 設定ファイルでは/で始まっていましたが、ここでは/を省略して書きます
    • "/roundRobinRouter"と書くと怒られます。akka.actor.InvalidActorNameException

実行してみます。

[info] Running akka.sample.AkkaExample04 
ここはどこ
receive 2
receive 1
receive 3
yeild!!
complete

2個ずつ処理されたのがわかるかと思います。

余談

先の実行結果で、「ここはどこ」が最初に出力されてます。 yeildって非同期になるんですね。知りませんでした。

今日はここまで。