scala – 如何使用参数化演员在akka中创建路由器?
我试图在
Scala中使用广播路由器,如果我没有弄错,它应该是这样的:
val system = ActorSystem("My beautiful system") val workerRouter = system.actorOf(Props[Agent].withRouter(BroadcastRouter(individualDefinitions.size)),name = "agentRouter") 这就是我从the tutorial I am following开始的理解. workerRouter充当另一个actor,我可以向这个路由器发送消息,将它们发送给所有代理(我拥有的个人定义). 问题是我想使用单独的定义来构建代理,它们实际上在构造函数中使用了一些参数,这些参数在individualDefinitions中. 问:我怎么能告诉路由器将这些参数作为构造函数的一部分传递给它们中的每一个? 请注意每个演员应该得到一个单独的定义,他们都是不同的.我不能在构造函数接收常量的相关问题中使用该解决方案:In Akka Java actor model,can a router create actors with non-default constructor? 请注意,这里每个actor应该有不同的参数,如果其中一个重新启动,它应该获得与它首先获得的相同参数.我不知道是否可以修改该解决方案来做到这一点. 可能的解决方案可以是使用actor作为路由器,以分离创建(构造函数)和路由,如问题Akka (java),non blocking broadcast to all children. 在这种情况下,我不确定这是“正确的”方法.使用演员作为路由器有几个问题(除了优雅).我担心扮演路由器的演员正在重新启动并失去所有订阅者.如果演员在一半循环中重新启动,如果我没有弄错的话,一些演员也会错过一些消息. 谢谢. 解决方法
您可以通过指定路由来创建路由器,这些路由器已经创建了一些由任何逻辑构造的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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |