Scala akka-从ActorSelection获取ActorRef列表

Scala akka-从ActorSelection获取ActorRef列表,scala,akka,Scala,Akka,ActorSelection支持并允许向所有与选择匹配的参与者发送消息: context.actorSelection("../*") ! msg 是否有方法检索与ActorSelection中的选择相匹配的ActorRef列表? 从中,我可以看到有一个resolveOne函数,但没有(例如)一个resolveList 更新 我想要ActorRef列表的原因是我想对所有匹配选择的参与者使用ask操作符 这里有一个我想做的例子: object MyActor { case object As

ActorSelection
支持并允许向所有与选择匹配的参与者发送消息:

context.actorSelection("../*") ! msg
是否有方法检索与
ActorSelection
中的选择相匹配的
ActorRef
列表? 从中,我可以看到有一个
resolveOne
函数,但没有(例如)一个
resolveList

更新

我想要
ActorRef
列表的原因是我想对所有匹配选择的参与者使用
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]
      }
  }
}

获取表单列表的功能

val timeout : FiniteDuration = 10 seconds

val actorList = actorSelection.resolveMany(timeout)
不存在。我怀疑原因是,一旦超时过期,就有可能返回长度非零的Iterable,但不可能知道Iterable是否全面。一些演员可能没有足够的时间作出回应。使用
resolveOne
时,问题不存在,第一个响应ActorRef就是结果

基于此,您似乎可以使用
Identify
消息让
actor选择中指定的所有
actor
响应标识:

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

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

这是一个很好的解决方案,当然有效。但这并不能解决我最初的问题。其实我的问题太笼统了。我会更新的更具体。@tano我根据你的更新更新了我的答案。