3

假设我有一个 Region Actor,每个区域里面都有一定数量的人。你如何向每个人广播消息,知道人员列表可以随时间变化,广播路由器似乎是选择,但问题是它们有最大数量的路由,我无法动态追加人员路由器。

我的问题是:我知道有一个 EventBus,我可以为我的人订阅事件总线,但我不希望他们收到发布的每条消息,我希望他们收到该地区的消息。

现在在akka中,我们必须创建一个具有一定数量routee的路由器,例如:

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);
4

1 回答 1

3

您的解决方案已经非常接近:您需要一个路由器,但不需要一个特制的预制路由器。相反,只需编写一个将消息转发给订阅者的 actor:

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());
      }
    }
  }
}
于 2013-04-06T11:14:49.227 回答