【问题标题】:Akka (java), non blocking broadcast to all childrenAkka(java),对所有孩子的非阻塞广播
【发布时间】:2013-03-30 18:08:15
【问题描述】:

假设我有一个区域 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);

【问题讨论】:

    标签: java akka broadcast router


    【解决方案1】:

    您的解决方案已经非常接近:您需要一个路由器,但不是特制的预制路由器。相反,只需编写一个将消息转发给订阅者的 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());
          }
        }
      }
    }
    

    【讨论】:

    • 哦,我明白了,所以我可以使用无类型的 Actor 作为路由器。非常感谢
    • 那么没有其他方法可以解决这个问题吗?因为如果我们向父母发送毒丸,它将杀死它下面的所有其他子演员。那么akka 使用什么机制来给他们的孩子发送消息呢?
    • 只有一种发送消息的机制,对于所有 ActorRefs 都是一样的。您可能会考虑不使用 PoisonPill 并为您的特定问题创建更有意义的消息类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 2014-03-08
    • 1970-01-01
    • 2018-01-04
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多