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")
Run Code Online (Sandbox Code Playgroud)
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()
}
Run Code Online (Sandbox Code Playgroud)
更多细节:http://doc.akka.io/docs/akka/2.2.0/scala/routing.html
| 归档时间: |
|
| 查看次数: |
5553 次 |
| 最近记录: |