8

我正在尝试在 Scala 中使用广播路由器,如果我没记错的话,它应该如下所示:

val system = ActorSystem("My beautiful system")
val workerRouter = system.actorOf(Props[Agent].withRouter(BroadcastRouter(individualDefinitions.size)), name = "agentRouter")

这就是我从我正在关注的教程中所理解的。

workerRouter 充当另一个参与者,我可以向该路由器发送消息,该路由器会将它们发送给所有代理(与我拥有的单个定义一样多)。

问题是我想使用单独的定义来构建代理,它们实际上在构造函数中采用了一些参数,而这些参数在 individualDefinitions 中。

问:我如何告诉路由器将这些参数作为构造函数的一部分传递给它们中的每一个?

请注意,每个演员都应该得到一个单独的定义,它们都是不同的。我不能在构造函数接收常量的相关问题中使用该解决方案:在 Akka Java 角色模型中,路由器可以使用非默认构造函数创建角色吗?

请注意,这里每个actor应该有不同的参数,如果其中一个被重新启动,它应该得到它最初得到的相同参数。我不知道是否可以修改该解决方案来做到这一点。

一个可能的解决方案可能是使用一个actor作为路由器,将创建(构造函数)和路由分开,如问题Akka(java),非阻塞广播到所有孩子

在这种情况下,我不确定这是“正确”的方法。使用演员作为路由器有几个问题(除了优雅)。我担心充当路由器的角色被重新启动并失去所有订阅者。如果演员在半个循环中重新启动,如果我没记错的话,一些演员也可能会错过一些消息。

谢谢你。

4

2 回答 2

7

您可以通过将一些已创建的参与者指定为路由来创建路由器,这些参与者由任何逻辑构建。

以下示例将创建 2 个不同创建的参与者,然后创建一个循环路由器,将消息路由到它们。

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

于 2013-08-20T20:29:42.710 回答
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");

这是在分钟内执行的 Best Effort 代码。在阿卡的时间。

于 2014-09-19T09:39:50.997 回答