読者です 読者をやめる 読者になる 読者になる

夢とガラクタの集積場

落ちこぼれ三流エンジニアである管理人の夢想=『夢』と、潰えた夢=『ガラクタ』の集積場です。

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メソッド中で処理されなかった
メッセージについては特にエラーなどは返って来ない・・?
とりあえず、こちらについては次回確認してみます。