检查ActorRef是否是用户监护人

时间:2014-03-13 18:04:55

标签: scala akka

在Akka Actor中,我想向我的父母发送一条消息,但前提是它不是用户监护人(即仅当Actor不是顶级演员时)。检查Actor的父母是否为用户监护人的最佳方法是什么?

我可以做类似的事情:

if(context.parent.path.toString != "akka://system/user") { ... }

但有更好的方法吗?我希望能够做到这样的事情:

if(context.parent != context.system.userGuardian) { ... }

2 个答案:

答案 0 :(得分:1)

有点棘手,但它有效:

if(context.parent != context.system.asInstanceOf[ExtendedActorSystem].guardian) {...}

答案 1 :(得分:0)

如果您有对用户监护人的引用,您应该可以进行==比较。这个简单的例子表明了相等的正确性。所以我想如果你想进行比较,你可以在某个地方解决用户监护人的问题并使其全局可用:

object RootGuardianTest extends App{
  val system = ActorSystem("test")
  system.actorOf(Props[ChildActor], "child")
}

trait RootComparison{ me:Actor =>

  def initCompare{
    val sel = context.system.actorSelection("/user")
    sel ! Identify()
  }

  def checkCompare:Receive = {
    case ActorIdentity(_, Some(ref)) =>      
      println(s"I am ${self.path}, and my parent is root: ${context.parent == ref}")    
  }
}

class ChildActor extends Actor with RootComparison{
  val child2 = context.actorOf(Props[Child2Actor], "child2")
  initCompare  
  def receive = checkCompare
}

class Child2Actor extends Actor with RootComparison{  
  initCompare  
  def receive = checkCompare
}

我,我只需查看父母路径的name部分,看看它是否是“用户”。像这样:

val parentIsUser = context.parent.path.name == "user"