親-子のアクターで、withRouter()を使いルーターを設定すると子がcontext.parentを参照できなくなります。解決方法と理由が知りたくて質問しました。

まずcontext.parentが参照できる例

case object Ping
case object Pong

object Sample1 {

  def run() = {
    val system = ActorSystem()
    val parent = system.actorOf(Props(classOf[Parent]), "parent")
    parent ! Ping
  }

  class Parent extends Actor {

    val worker = context.actorOf(Props(classOf[Child]), "child")

    def receive = {
      case Ping =>
        worker ! Ping
      case Pong =>
        println("PONG!")
    }
  }

  class Child extends Actor {

    def receive = {
      case Ping =>
        println(context.parent)
        context.parent ! Pong
    }
  }

}

printで

Actor[akka://default/user/parent#-1479915643]
PONG!

このように出力がされ、期待通りに動いてます。

workerを作るところで、withRouterを設定すると

val worker = context.actorOf(Props(classOf[Child]).withRouter(RoundRobinPool(3)), "child")

結果が

Actor[akka://default/user/parent/child#-761629135]

このようにPONG!が出なくなり、context.parentが自身のchildになってます。

もちろんsenderでやれば送り元の親に返せるんですが、postRestart等でフックしたときにsenderだと親に返せなくて、context.parentにしたらこの現象に遭遇したという感じです。

詳しい方ご教授ください。

よろしくおねがいします m(_ _ )m