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]
}
}
}
答案 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)) => ...
}
}