Akka(java),非阻止向所有孩子播放

时间:2013-03-30 18:08:15

标签: java akka broadcast router

假设我有一个地区演员,每个地区都有一定数量的人。如何向所有人广播消息,知道人员列表可以随时间变化,广播路由器似乎是选择,但问题是他们有最大数量的路由,而且我不能动态地追加人路由器。

我的问题是:我知道有一个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);

1 个答案:

答案 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());
      }
    }
  }
}