Akka-Actor サンプリング

Java8がリリースされたのを期に、こちらを参考にしながらJVMの並行性について学習。
引き続き、並列、平行、分散処理を簡単に記述するためのScalaのライブラリ:Akkaに
ついて学習。
とてもわかりやすいサンプルで学習を始めるも、仕様変更のためコンパイルエラー。
こちらのページAkka公式ページを参考にしてサンプリング。

[Actorクラス]

import akka.actor.Actor

class MyActor extends Actor{
  def receive = {
    case i: Int =>println("Int=" +i)
    case msg => {
      println(msg + " by MyAkkaActor")
      sender() ! ("Hello, " + msg.toString)
    }
  }
}

[Mainクラス]

import akka.actor.ActorSystem
import akka.actor.Props
import actor.MyActor
import akka.pattern.ask
import akka.util.Timeout
import scala.concurrent.duration._
import scala.concurrent.Await
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import java.util.Date

object Main {
  def main(args: Array[String]) {
    println("main start:" + new Date())
    val system = ActorSystem("sample")
    val myAkkaActor = system.actorOf(Props[MyActor])
    // 非同期実行
    val result = myAkkaActor ! 100
    println("result = " + result)
    // 
    implicit val timeout = Timeout(5 seconds)
    // 同期実行
    val future = myAkkaActor ? "uyaji"
    val result2 = Await.result(future, timeout.duration).asInstanceOf[String]
    println("result = " + result2)
    // 非同期の結果待ち(Futureを返す)
    val resultFuture = myAkkaActor ? "uyama"
    resultFuture.onSuccess {
      case result => println("result = " + result)
    }
    println("main end:" + new Date())
    Thread.sleep(500)
    system.shutdown
  }
}

[実行結果]

main start:Thu Oct 30 18:25:09 JST 2014
result = ()
Int=100
uyaji by MyAkkaActor
result = Hello, uyaji
uyama by MyAkkaActor
main end:Thu Oct 30 18:25:14 JST 2014
result = Hello, uyama

非同期実行は、結果を出力できず。
同期実行は、結果出力。
非同期の結果待ちは、main end:メッセージ出力後に結果出力

なるほど!