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

Akka参与者,等待完成初始化问题

米裕
2023-03-14

我的应用程序使用一个主管akka actor,在内部初始化其他参与者(child)。然而,由于它是异步进行的,所以我在尝试使用Akka TestKit编写测试时遇到了问题。

例如,当试图测试一个系统是如何从另一个系统终止通过发送消息到一个子演员的主管,我创建一个新的演员系统,然后与actorOf一个主管,它接收一个配置(用于在里面创建子演员主管),像这样:

val anotherSystem: ActorSystem = ActorSystem("anotherSystem")

anotherSystem.actorOf(Props(classOf[Supervisor], new ConfigurationFromStatic(configsAnother), metrics), "AnotherSupervisor")

然后,如果我尝试使用actorSelection向另一个主管中的子参与者发送消息,则会失败,因为该子参与者尚未可选择

anotherSystem.actorSelection("/user/AnotherSupervisor/AnotherManagementReceiver") ! message
expectMsg(Ack)

失败,因为还没有创建ANTHERManagementRecector

使用Thread.sleep(5000)工作,但这太糟糕了。

在寻找可能的解决方案后,我测试了:

anotherSystem.actorSelection("/user/AnotherSupervisor/AnotherManagementReceiver").resolveOne() ! message

对现有参与者消息也失败。

还尝试了EventFilter以获得儿童演员在日志中的回声:

EventFilter.info("Management consumer started", occurrences = 1) intercept {
   anotherSystem.actorOf(Props(classOf[Supervisor], new ConfigurationFromStatic(configsAnother), metrics), "AnotherSupervisor")
}

这会一直等到超时(我甚至看到日志消息),但我猜EventFilter只从TestKit创建的“主”参与者系统中读取。

关于如何应对这种情况,有什么想法或建议吗?


共有1个答案

岳玉书
2023-03-14

一种更可靠、更一致的方法是让已知的参与者将您介绍给更多的参与者:在这种情况下,主管是开始沟通的入口点。您可以通过此参与者转发所有消息,也可以为子参与者添加查找协议,其他人可以在其中向主管询问他们的ActorRefs。

ActorSelection仅用于远程节点之间的初始通信,以获得第一个ActorRef。从那以后,只使用如上所述的消息要好得多。

 类似资料:
  • 我很难弄清楚我如何知道我的演员何时从非演员代码中完成。 尝试使用akka演员进行并行执行,这似乎真的很好,但我需要知道何时所有人都完成了。 我添加了一个监督者演员,产生演员来做工作,从监督者/父演员,我可以观看孩子的终止消息。 我需要从akka actor系统之外的常规java代码中得到帮助,以确定我的监督actor是否完成。 这是否可能,请提供指针。 谢谢哈瑞

  • 我的实验应用程序非常简单,尝试使用Actor和Akka可以做什么。 JVM启动后,它创建了一个带有几个普通角色的角色系统,即JMS消费者(akka.camel.Consumer)和JMS生产者(akka.camel.Producer)。它在演员和JMS制作人之间传递一些信息- 我时不时地遇到奇怪的行为:似乎时不时地,应该发送到JMS服务器的第一条消息不知何故丢失了。通过查看我的应用程序日志,我可以

  • 我正在使用与Salim在这里发布的内容类似的实现使用Selenium测试AngularJS 然而,当运行时,检查将系统性地等待“webdriver等待”期。 据我所知,无论发生什么,布尔检查总是返回false。 有人有什么想法吗? 我试图缩短等待的超时值以及更改池速率,但所做的只是使用这些新值,而不是真正“返回true”检查。 预期:只要Angular没有任何挂起的http\U请求,等待就会结束

  • 我有一个生产者,它从Rest API下载页面中的数据,以及几个处理页面的消费者(例如,将它们加载到数据库中)。 我希望生产者和消费者并行工作,这意味着生产者不应该等到一个页面被消费后再下载下一个页面。每个使用者都需要按顺序处理页面。 当下载所有页面时,主线程应该等待所有消费者完成他们的工作(因为消费可能比生产需要更长的时间)。 我目前的做法如下: 我已经创建了一个下载页面的可观察对象,它在附加消费

  • 我正在运行的服务器应用程序获取我要使用任务系统处理的多个任务请求。 每个任务都表示为一个可运行的线程池,该线程池中的线程数小于或等于线程池的大小,需要线程池中的线程数。当然,线程池是必要的,以避免CPU因线程过多而过载。 然而,其中一些任务可以是多线程的,而另一些则不能。这就是为什么一个任务可能需要等待其所有特定线程完成,以便合并这些线程的结果以获得最终结果的原因。 如果使用多个实例,则可以像这样

  • 我通读了Dart/flatter中的Async/Await/then,试图理解为什么aysnc函数中的Await不会等到完成后再继续。在我的UI中,有一个按钮调用一个异步方法来返回一个位置,该位置总是返回null,并且不等待函数完成。 该函数将调用推送到一个新的UI页面,该页面选择一个位置,并应返回一个结果。如何使该函数等待结果?我不是在使用异步吗?