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我根据你的更新更新了我的答案。