Try*_*lks 8 routing constructor scala akka
我试图在Scala中使用广播路由器,如果我没弄错,它应该是这样的:
val system = ActorSystem("My beautiful system")
val workerRouter = system.actorOf(Props[Agent].withRouter(BroadcastRouter(individualDefinitions.size)), name = "agentRouter")
workerRouter充当另一个actor,我可以向此路由器发送消息,将消息发送给所有代理(我拥有的个人定义).
问题是我想使用单独的定义来构建代理,它们实际上在构造函数中使用了一些参数,这些参数在个体定义中.
问:作为构造函数的一部分,我怎么能告诉路由器将这些参数传递给它们中的每一个?
请注意每个演员应该得到一个单独的定义,他们都是不同的.我不能在构造函数接收常量的相关问题中使用该解决方案:在Akka Java actor模型中,路由器是否可以使用非默认构造函数创建actor?
请注意,这里每个actor应该有不同的参数,如果其中一个重新启动它应该获得它在第一个位置获得的相同参数.我不知道是否可以修改该解决方案来做到这一点.
一个可能的解决方案可能是使用actor作为路由器,分离创建(构造函数)和路由,如问题Akka(java),非阻塞广播给所有孩子.
在这种情况下,我不确定这是"正确的"方法.使用actor作为路由器有几个问题(除了优雅).我担心扮演路由器的角色重新启动并失去所有订阅者.如果演员在一半循环中重启,如果我没有弄错的话,一些演员也会错过一些消息.
谢谢.
你可以通过指定一些已经创建的actor作为路由来创建路由器,由任何逻辑构造.
以下示例将创建以不同方式创建的2个actor,然后创建一个循环路由器,用于将消息路由到它们.
class MyActor(param1: String) extends Actor with ActorLogging {
  def receive: Actor.Receive = {
    case msg => log.info("Message from {}: {}", param1, msg)
  }
}
object MyActor {
  def apply(param: String): Props = Props(new MyActor(param))
}
object Main extends App {
  val system = ActorSystem()
  val a1 = system.actorOf(MyActor("actor1"))
  val a2 = system.actorOf(MyActor("actor2"))
  val routerProps = Props.empty.withRouter(RoundRobinRouter(routees = Vector(a1, a2)))
  val router = system.actorOf(routerProps)
  for (i <- 1 to 10) {
    router ! i
  }
  readLine()
  system.shutdown()
}
更多细节:http://doc.akka.io/docs/akka/2.2.0/scala/routing.html
| 归档时间: | 
 | 
| 查看次数: | 5553 次 | 
| 最近记录: |