我正在维护演员注册表,如下所示:
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
实现这一点?
答案 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
实现。