阿卡演员选择

时间:2015-03-31 00:09:39

标签: scala akka actor

我正在维护演员注册表,如下所示:

val system = ActorSystem("MySystem")
val actorRegistry = HashMap[String, ActorRef]()

def process(msg: Message, keys: List[String]): Unit = {
  for (key <- keys) {

    //Lookup the actor or create a new actor and register
    val actor = actorRegistry getOrElseUpdate(key, 
      system actorOf(Props[MyActor], name = key))

    actor ! msg
  }
}

这是一种惯用的方法,还是我应该使用ActorSelection实现这一点?

1 个答案:

答案 0 :(得分:4)

您可能需要考虑使用Akka Routing。来自doc的一个例子:

import akka.routing.ActorRefRoutee
import akka.routing.Router
import akka.routing.RoundRobinRoutingLogic

class Master extends Actor {
    var router = {
        val routees = Vector.fill(5) {
            val r = context.actorOf(Props[Worker])
            context watch r
            ActorRefRoutee(r)
        }
        Router(RoundRobinRoutingLogic(), routees)
    }

    def receive = {
        case w: Work =>
            router.route(w, sender())
        case Terminated(a) =>
            router = router.removeRoutee(a)
            val r = context.actorOf(Props[Worker])
            context watch r
            router = router.addRoutee(r)
    }
}

您的代码看起来非常类似于常规路由器,即您有一堆相同类型的角色MyActor处理相同类型的消息Message。如果您使用akka.routing.BroadcastRoutingLogic将消息发送到所有路由,您将获得与您拥有的非常类似的东西,并且您将获得处理故障的框架的所有支持。不同之处在于,您的keys列表可能会小于actorRegistry,但如果真的需要,可以使用自定义RoutingLogic实现。