当前位置: 首页 > 知识库问答 >
问题:

Akka:动态地将参与者添加到路由器

车思淼
2023-03-14

随着时间的推移,让广播演员动态添加/删除路由的正确方法是什么?

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

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

我想从固定的路由列表

        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,其中在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));

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

编辑:我相信现在我正在寻找的是事件总线而不是广播路由

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

共有2个答案

籍利
2023-03-14

使用事件总线而不是广播路由器:

final ActorRef actor = system.actorOf(new Props(LimitOrderActor.class));
system.eventStream().subscribe(actor, String.class);
常哲彦
2023-03-14

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

在scala中,您需要的是非常简单的侦听器特性,遗憾的是,在使用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用户/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-java中的小示例

 类似资料:
  • 有人能解释一下(如果可能的话,用一些代码或参考)独立路由器和自包含的路由器参与者之间有什么区别吗? 提前谢谢你。 编辑: 与此相比有何不同?: 在性能或能力方面有什么区别吗?

  • ``` 所以,我的问题是--有没有一种干净的方法来结构和重构路由,而不是将它们集中在一个大的路由定义中?我也许可以创建一个参与者(路由器)的层次结构,主路由定义只是将其委托给路由器,随着我们深入参与者层次结构,我们会逐步添加更多的细节。但是否有一两种普遍接受的模式来组织路线呢?

  • 因此,我的问题是面板被插入到JScrollPane中,这些面板的大小正在减小,但没有滚动条。 这是我的代码,我已经播种很远:

  • composer participant add命令将参与者的新实例添加到参与者库中。查看“ 添加参与者 ”任务,了解使用此命令或API的演练。 data选项必须包含一个代表要添加的参与者的序列化JSON串,并且必须用单引号包裹。 句法 composer participant add composer participant add [options] Participant options

  • 问题内容: 我对此有疑问。我有一个JPanel,通常我会像这样创建一个JLabel: 但是我希望每次单击一个按钮时,在该面板中创建一个新的JLabel,它的大小相同,但高度不同。我试过了: 但是这样一来,我就无法设定界限。我从JTextField获得的stringName。 问题答案: 首先,使用layout。正确完成布局后,组件将按照需要放置。其次,在向布局动态添加组件时,您需要告诉布局更新。这