【问题标题】:How to get ActorRefs of all children of a RouterPool in Akka如何在 Akka 中获取 RouterPool 的所有子项的 ActorRefs
【发布时间】:2015-05-19 11:01:28
【问题描述】:

我这样创建一个actor的RouterPool:

val myActorPool = Akka.system.actorOf(RoundRobinPool(5).props(Props[MyActor]), "myActor")

现在我想访问由该路由器管理的 5 个孩子的 ActorRef 对象。是否有一些方法调用来为所有孩子检索它?还是我必须明确声明它们然后将它们传递给路由器?

【问题讨论】:

  • 如果你想控制孩子,你可以考虑使用循环组而不是池。
  • 好的,所以我想这意味着现在有一个简单的方法调用可以从池中获取 actorRefs,我必须明确声明它们并将它们添加到组中。
  • 是的。汇集的演员意味着您无法控制。如果您需要控制它们,请使用组。

标签: scala akka akka-supervision


【解决方案1】:

akka.routing.GetRoutees 发送给路由器actor 将使其在akka.routing.Routees 消息中发回其当前使用的路由

来自:http://doc.akka.io/docs/akka/2.3.11/scala/routing.html#Managagement_Messages

【讨论】:

  • 好的,这不会返回实际的 ActorRef 对象,但 Routee 似乎足以满足我的目的。
【解决方案2】:

聚会有点晚了,但我是这样做的,前提是你使用的是Routees,即ActorRefRoutee

val actor: Option[ActorRefRoutee] = myActorPool.logic.select("Hello", routees /*Should be able to generate these from router*/) match { 
 case actorRefRoutee: ActorRefRoutee => 
   Some(actorRefRoutee) 
 case _ => 
   None
}

那么你可以通过调用来获取actor引用:

actor.ref

【讨论】:

    【解决方案3】:

    很长一段时间过去了,我对 Akka.Net 有同样的问题,但没有找到有效的答案。在调试器中发现返回对象的类型帮助了我:

    _router.Tell(new GetRoutees());
    ...
    // router callback
    var routees = message as Routees;
    if (routees != null)
    {
        IEnumerable<IActorRef> routeeRefs = routees.Members.Select(r => ((ActorRefRoutee) r).Actor);
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 2016-03-18
      相关资源
      最近更新 更多