我有简单的 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,因为我有以下用例:
所以问题是如何在两个不同的路由器角色中重用actor?
答案 0 :(得分:1)
对于您的用例,您不需要两个不同的路由器,因为您只需发送包含您的订阅请求的akka.routing.Broadcast
消息,它将被路由到RoundRobinRouter的所有路由。
通常,如果您想使用两个不同的路由器路由到同一组目标,那么您需要单独创建路由并将它们传递给路由器,如here所述(向下滚动一点位)。