我正在尝试在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充当另一个角色,我可以向此路由器发送消息,将消息发送给所有代理(我拥有的个人定义)。
问题在于我想使用单独的定义来构建代理,它们实际上在构造函数中使用了一些参数,这些参数在个别定义中。
问:我如何告诉路由器将这些参数作为构造函数的一部分传递给每个参数?
请注意每个演员应该得到一个单独的定义,他们都是不同的。我不能在构造函数接收常量的相关问题中使用该解决方案: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作为路由器有几个问题(除了优雅)。我担心扮演路由器的角色重新启动并失去所有订阅者。如果演员在一半的循环中重新启动,如果我没有弄错的话,一些演员也会错过一些消息。
谢谢。
答案 0 :(得分:7)
您可以通过指定路由来创建路由器,这些路由器已经创建了一些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
答案 1 :(得分:0)
public class Master extends UntypedActor {
-----
-----
public Master() {
workerRouter = this.getContext().actorOf(Worker.createWorker().withRouter(new RoundRobinRouter(8)), "workerRouter");
}
使用Akka 2.4.2,我们可以简单地使用:
workerRouter = this.getContext().actorOf(new RoundRobinPool(noOfWorkers).props(Props.create(Worker.class)), "workerRouter");
这是在min中执行的最佳努力代码。时间在阿卡。