java - Akka:动态添加Actors到BroadcastRouter

标签 java events akka actor

让广播参与者随时间动态添加/删除路由的正确方法是什么?

问题的背景: 一个参与者监听特定商品的价格变化,然后它向所有其他参与者(路由)广播价格变化,他们根据内部规则行事(例如,如果价格是 X 买入或卖出)。

我是 Akka 的新手,但在阅读了 documentation 之后我相信我已经找到所需的组件,但如果您觉得我的设计或使用的组件不正确,请发表评论/回答。

我想从一个固定的routees列表中改变

        ActorRef actor1 = system.actorOf(new Props(LimitOrderActor.class));
        ActorRef actor2 = system.actorOf(new Props(LimitOrderActor.class));
        ActorRef actor3 = system.actorOf(new Props(LimitOrderActor.class));
        Iterable<ActorRef> routees = Arrays.asList(new ActorRef[] { actor1, actor2, actor3 });
        ActorRef actorBroadcastRouter1 = system.actorOf(new Props(TickerWatcherActor.class).withRouter(BroadcastRouter.create(routees)), "router1");

类似于动态大小的 BroadcastRouter,其中 actor 在 BroadcastRouter 启动并运行后创建

        int lowerBound = 1;
        int upperBound = 10000;
        DefaultResizer resizer = new DefaultResizer(lowerBound, upperBound);
        BroadcastRouter broadcastRouter2 = new BroadcastRouter(resizer);
        ActorRef actorBroadcastRouter2 = system.actorOf(new Props(TickerWatcherActor.class).withRouter(broadcastRouter2), "router2");

        ActorRef actor4 = system.actorOf(new Props(LimitOrderActor.class).withRouter((RouterConfig) broadcastRouter2));
        ActorRef actor5 = system.actorOf(new Props(LimitOrderActor.class).withRouter((RouterConfig) broadcastRouter2));
        ActorRef actor6 = system.actorOf(new Props(LimitOrderActor.class).withRouter((RouterConfig) broadcastRouter2));

现在,Actor“actorBroadcastRouter2”正在接收消息,而不是预期的 LimitOrderActor actor 4、5 和 6。我做错了什么?

编辑:我相信现在我正在寻找的是 Event Bus不是广播路由器

   final ActorRef actor = system.actorOf(new Props(LimitOrderActor.class));
   system.eventStream().subscribe(actor, String.class);

最佳答案

让我们结束这个问题,我遇到了同样的问题。这不是广播路由器的工作方式。您在 actor4actor5actor6 中创建新的广播路由器,而不是添加到 actorBroadcastRouter2 中的现有广播路由器。

你想要的在 scala 中非常简单,具有 Listeners 特性,遗憾的是在使用 Java 编程 Akka 时不可用:

class MyActor extends Actor with Listeners {
  def receive = {
     case yourmessages => gossip("To All my listeners")
  } orElse listenerManagement
}

val myActor = context.actorOf(Props[MyActor])

myActor ! Listen(someActorRef)

myActor ! "pigdog"

必须做你自己的 Java 版本或使用 DistributedPubSubExtension 以获得更成熟的东西。

https://groups.google.com/forum/?fromgroups=#!topic/akka-user/NEOY9IxRW5I

https://github.com/akka/akka/blob/master/akka-actor/src/main/scala/akka/routing/Listeners.scala

http://doc.akka.io/docs/akka/snapshot/contrib/distributed-pub-sub.html#a-small-example-in-java

关于java - Akka:动态添加Actors到BroadcastRouter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13345182/

相关文章:

java - 从网络读取 xml

javascript - 同时将事件绑定(bind)到多个 jquery 元素

nservicebus - *nix 生态系统中存在哪些消息总线技术?

scala - Akka 框架 (Scala) - 代理存储大型复杂状态

java - 我怎样才能让我的翻译器将摩尔斯电码检测为字符串,而不是字符

java - 我正在使用 Java 构建计算器,但在执行运算符时遇到问题

java - 日期格式解析错误

javascript - JavaScript 中的加速器 UI

java - 如何从可编辑组合框中更改的文本获取事件?

html - 在 Scala 中开发 Web 应用程序需要哪些主题?