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:メッセージ出力後に結果出力
なるほど!