日曜日, 2月 07, 2016

Scala - 初めてのAkka - アクター

最近の流行りはどうやらreactive programming..らしく.. というか別に新しいものじゃない..old wine in a new bottleの典型例ではないか...
憤る気分を抑えながらもakkaを試してみた.
以下の例は単純なアクターをつくった例.私が読んだ本でakkaが紹介されているが,そのサンプルはakkaの非同期的性質を無視した代物であり,ランダムに失敗する.というわけで,以下の例は汚く危ない例ではあるがフェイルはしないようフラグを付けたもの.フラグを外すと,メッセージが到着する前にActorSystemが閉じることもある為,ランダムにdead letter のエラーが出るだろう.
import akka.actor.{Actor, ActorSystem, Props}
import akka.event.Logging

/**
  * Created by neko32 on 2016/02/07.
  */

object HelloActor {
  var flag = false
}

class HelloActor(processId:Int, processName:String) extends Actor {

  val log = Logging(context.system, this)
  def receive = {
    case "hello" => { log.info(s"[HELLO@${processName}:${processId}]"); println("Konnitiwa!");HelloActor.flag = true }
    case _ => { log.info(s"[UNKNOWN@${processName}:${processId}]"); println("..."); }
  }
}

object Runner extends App {

  val sys = ActorSystem("HelloSystem")
  val helloActor = sys.actorOf(Props(new HelloActor(1, "Tanuki")), name = "helloActor")
  helloActor ! "muimui!"
  helloActor ! "RUirui!"
  helloActor ! "hello"
  while(!HelloActor.flag) {
    Thread.sleep(1000)
  }
  sys.shutdown

}