创建一个路由器actor,用于参数化akka java中每个路由器的创建

时间:2014-09-29 17:46:39

标签: java akka

我需要知道如何创建一个RoundRobinPool路由器Actor,其中每个路由器都有自己对另一个对象的引用。每个被保险人持有的参考资料对于每个被保险人必须是不同的。

这样做的方法是这样的:

ActorRef ref = system.actorOf(new RoundRobinPool(5).props(Props.create(Worker.class, new AnotherObject())), 
"router");

但这种方法的问题在于每个工作者都对AnotherObject有相同的引用,我不希望这种副作用。

这将是这样的,但使用路由器角色:

List<Routee> routees = new ArrayList<Routee>();
    for (int i = 0; i < 5; i++) {
      ActorRef r = system.actorOf(Props.create(Worker.class, new AnotherObject()));
      routees.add(new ActorRefRoutee(r));
    }
    Router router = new Router(new RoundRobinRoutingLogic(), routees); // That is a Router I need an ActorRef

有人知道怎么做吗?

干杯

2 个答案:

答案 0 :(得分:1)

查看有关Router groups的Akka Java文档。您可以单独创建路由,然后通过配置或以编程方式将它们提供给路由器组。在您的情况下,编程可能是您所追求的,因此您可以向每个routee传递不同的引用。

答案 1 :(得分:0)

您可以使用RoundRobinGroup。使用组,您可以创建所需的actor,然后在创建组时将actor的路径传递给Group。池和组之间的区别仅在于如何创建路由。

使用实际代码编辑

String parent = new String("/user/<whatever is your actual path to routees>");
List<String> routees = new ArrayList<String>();
for (int i = 0; i < 5; i++) {
  ActorRef r = system.actorOf(Props.create(Worker.class, new AnotherObject()), “route” + i);
  routees.add(parent + “routee” + i);
}
system.actorOf(new RoundRobinGroup(routees).props(), “router”);