Akka同时使用两个路由器配置路由

时间:2013-11-28 12:04:48

标签: java akka

我有简单的 UntypedActor ,它有一组订阅者。 Actor可以处理两种类型的消息('SUB' - 向订阅者添加发件人,'UNSUB' - 从订阅者中删除发件人)以及重新发送给订阅者的其他消息。

private static class Dispatcher extends UntypedActor {
    private Set<ActorRef> subscribers;

    public Dispatcher() {
        subscribers = Sets.newHashSet();
    }

    @Override
    public void onReceive(Object o) throws Exception {
        if ("SUB".equals(o)) {
            subscribers.add(getSender());
            return;
        }

        if ("UNSUB".equals(o)) {
            subscribers.remove(getSender());
            return;
        }

        for (ActorRef subscriber : subscribers) {
            subscriber.tell(o, getSender());
        }
    }
}

我想用两种不同的策略创建路由器:broadcast,roundrobin。

    final int routeeCount = 2;

    BroadcastRouter broadcastRouter = new BroadcastRouter(routeeCount);
    RoundRobinRouter roundRobinRouter = new RoundRobinRouter(routeeCount);

    ActorRef broadCastRef = actorSystem.actorOf(Props.create(Dispatcher.class)
            .withRouter(broadcastRouter), "Broadcast");
    ActorRef roundRobinRef = actorSystem.actorOf(Props.create(Dispatcher.class)
            .withRouter(roundRobinRouter), "RoundRobin");

每个路由器都会创建个人路由器组,但它不适合我。我想路由器使用相同的actor,因为我有以下用例:

  1. 演员 A B 将消息'SUB'发送到 broadCastRef ;
  2. broadCastRef 向其自己的2个子actor( X1 X2 )广播消息(routeeCount = 2);
  3. 从现在开始,我将使用 roundRobinRef 将消息传递给演员 A B
  4. 所以问题是如何在两个不同的路由器角色中重用actor?

1 个答案:

答案 0 :(得分:1)

对于您的用例,您不需要两个不同的路由器,因为您只需发送包含您的订阅请求的akka.routing.Broadcast消息,它将被路由到RoundRobinRouter的所有路由。

通常,如果您想使用两个不同的路由器路由到同一组目标,那么您需要单独创建路由并将它们传递给路由器,如here所述(向下滚动一点位)。