akkaでwithRouterするとcontext.parentがとれなくなる
親-子のアクターで、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