假设我有一个地区演员,每个地区都有一定数量的人。如何向所有人广播消息,知道人员列表可以随时间变化,广播路由器似乎是选择,但问题是他们有最大数量的路由,而且我不能动态地追加人路由器。
我的问题是:我知道有一个EventBus,我可以订阅我的人员到活动总线,但我不希望他们收到所发布的每条消息,我希望他们收到该地区的消息。
现在在akka,我们必须创建一个具有一定数量路由的路由器, 例如:
Router router = new router(person1, person2)
这很糟糕,因为在开始时该地区没有人,我不知道将加入我所在地区的人。
有没有办法制作一种动态路由器: 例如:
Region region = new region()
region.router = new Router()
Person person1 = new Person()
region.router.subscribe(person1);
region.router.tell("hello",null);
答案 0 :(得分:3)
您的解决方案已经非常接近:您需要一台路由器,而不是一台特制的预制路由器。相反,只需编写一个将消息转发给订阅者的演员:
class MyRouter extends UntypedActor {
final Set<ActorRef> subscribers = new HashSet<ActorRef>();
@Override public void onReceive(Object msg) {
if (msg instanceof Subscribe) {
subscribers.add(getSender());
} else if (msg instanceof Unsubscribe) {
subscribers.remove(getSender());
} else {
for (ActorRef target: subscribers) {
target.tell(msg, getSender());
}
}
}
}