akka - 从ActorSelection获取ActorRef列表

时间:2016-02-25 10:39:39

标签: scala akka

ActorSelection支持wildcard,它允许向与所选内容匹配的所有演员发送消息:

context.actorSelection("../*") ! msg

有没有办法检索与ActorRef中的选择匹配的ActorSelection列表? 从documentation我可以看到有一个resolveOne函数,但没有(例如)一个resolveList

更新

我想要ActorRef列表的原因是我想在匹配选择的所有actor上使用ask运算符。

这里要清楚的是我想做的一个例子:

object MyActor {
  case object AskAllActors
  case object GetActorInfo
}

class MyActor extends Actor {
  import MyActor._

  def receive = {
    case AskAllActors =>
      val actors: List[ActorRef] = context.actorSelection("../*").resolveList()
      val result: List[Future[String]] = actors.map { a => (a ? GetActorInfo).mapTo[String] }
      Future.sequence(result).map { result =>
        // do something with result: List[String]
      }
  }
}

1 个答案:

答案 0 :(得分:1)

获取表单列表的能力

val timeout : FiniteDuration = 10 seconds

val actorList = actorSelection.resolveMany(timeout)

不存在。我怀疑原因是因为一旦超时到期,就有可能返回一个非零长度的Iterable但是不可能知道Iterable是否全面。有些演员可能没有足够的时间回应。如果resolveOne问题不存在,则第一个响应的ActorRef就是结果。

根据documentation,您可以使用Identify消息让Actors中指定的所有actorSelection回复标识:

class Follower extends Actor {
  val identifyId = 1
  context.actorSelection("../*") ! Identify(identifyId)

  def receive = {
    case ActorIdentity(`identifyId`, Some(ref)) => ...
  }
}