Akka Actor確認(パラメータ、初期化/終了時処理)
こんにちは。
内容的にScalaの復習も兼ねていますがまぁお気になさらず。
前回とりあえず最低限動作するものを作成しました。
今回はActorに対してパラメータを渡す方法と、
初期化処理/終了時処理をどう記述するかを確認してみます。
Actorのソースを見ると、下記のように初期化処理/終了時処理用のメソッドが用意されています。
■Actor.scala
trait Actor { // (省略) /** * User overridable callback. * <p/> * Is called when an Actor is started. * Actors are automatically started asynchronously when created. * Empty default implementation. */ @throws(classOf[Exception]) // when changing this you MUST also change UntypedActorDocTest //#lifecycle-hooks def preStart(): Unit = () // (省略) /** * User overridable callback. * <p/> * Is called asynchronously after 'actor.stop()' is invoked. * Empty default implementation. */ @throws(classOf[Exception]) // when changing this you MUST also change UntypedActorDocTest //#lifecycle-hooks def postStop(): Unit = () // (省略) }
そのため、初期化処理/終了時処理を記述し、かつパラメータを渡して初期化する方式に修正します。
#今回は併せて受信したメッセージが文字列の場合にのみ処理を行うよう修正
■HelloWorldActor.scala
class HelloWorldActor(name :String) extends Actor { /** * Actor初期化時処理 */ override def preStart = {println(name + " is started.") } /** * メッセージ受信時処理 */ def receive = { case msg: String => { println("HelloWorldActor: Hello world! " + msg + " My name is " + name) } } /** * Actor終了時処理 */ override def postStop = {println(name + " is stopped.") } }
■HelloWorldApp.scala
object HelloWorldApp extends App { override def main(args: Array[String]): Unit = { val system = ActorSystem.apply("HelloWorldApp") val helloWorldActor = system.actorOf(Props.apply(new HelloWorldActor("actor1")), "HelloWorldActor") helloWorldActor ! """Test1""" helloWorldActor ! """Test2""" helloWorldActor ! 1 system.shutdown() } }
上記のコードを作成して実行すると下記の結果が得られます。
actor1 is started. HelloWorldActor: Hello world! Test1 My name is actor1 HelloWorldActor: Hello world! Test2 My name is actor1 actor1 is stopped.
初期化/終了時の処理が実行されていることが確認でき、
パラメータとして渡した名前についてもActor側で保持して動作していることがわかります。
ただ、receiveメソッド中で処理されなかった
メッセージについては特にエラーなどは返って来ない・・?
とりあえず、こちらについては次回確認してみます。