【问题标题】:Akka actor cannot be resolved with actorSelectionAkka actor 无法用 actorSelection 解决
【发布时间】:2014-04-12 02:35:26
【问题描述】:

你好!我先说我们是 Akka 的新手

问题

我们处于一种奇怪的情况,我们希望通过actorSelection 方法使用它的路径解析一个actor,但是除了特定的一个之外,该路径在很多情况下都在源代码中被解析。 我们在 android 中,我们有一个Receiver,它激活了演员发送各种消息的过程。在某个时候,这个消息序列已经完成,但我们没有终止参与者系统

然后有另一个 Receiver 被调用。在该接收器内部,actor 系统 仍然存在,因为它已保存在 object var 中。使用那个actor系统,我们正在尝试解析actor,但是无论解析超时有多大,都无法找到actor。 我们不确定 actor 是否已经死亡,但代码非常干净,因此该 actor 内部可能没有抛出异常。

注意:actor的子代在父actor的构造函数中被创建为private val ...(也不确定这是否是最佳策略)

到目前为止已经尝试过什么

首先因为actorSelection返回一个future,我们使用Await.result方法来获取这个future的值。 其次,我们在许多不同的设备上尝试了各种 android api,并尝试了不同版本的 akka-library。

您是否知道可能会发生什么,或者知道我如何才能确切地知道正在发生的事情而这个演员解析失败?

编辑#1

由于广播接收器的生命周期,从 BroadcastReceiver 内部尝试从一开始就注定会失败。所以起初Android似乎是罪魁祸首,我们必须创建两个服务。远程Service(粘性)用作存储ActorSystem 的进程。但是因为从 BroadcastReceiver 内部绑定到服务是不可能的,我们不得不创建一个 IntentService 只是为了在 BroadCastReceiver 和 IntentService 之间进行中间处理。
不幸的是,结果还是一样。一切正常,除了演员无法解决..

编辑#2

我们对无法解决的演员设置了死亡守望,但结果仍然相同,我们无法收到任何已终止的消息。 在上述尝试失败后,我们尝试创建一个完整的新项目,删除所有不必要的代码。该努力的结果是错误消失了!(可能)。因此我们必须得出结论,我们的一些原始代码首先应该归咎于被破坏的actor。

【问题讨论】:

  • 一些代码示例在这里可能会有所帮助。一种可能性是,根据谁“拥有”所讨论的演员,也许你走错了路。当您尝试查找的演员开始时,让它打印它的路径 (self.path) 并确保它与您正在查找的内容相匹配。
  • 您好!是的,我们已经检查过路径是否完全相同,并且仍然如此。我们已经通过更多努力更新了这个问题,以检查问题是否是由 Android 端引起的。您需要什么样的代码示例?我们可能会尝试创建一个示例项目来显示问题,以防其他一切都失败。谢谢

标签: android akka actor


【解决方案1】:

您的问题缺少很多有用的信息(例如,关于哪个演员在哪个路径查找哪个其他演员路径),但我的主要怀疑是您在要查找的演员的父级中使用 Await.result ,这会阻止消息传递给该参与者(因为每个父母都需要在后台转发消息 - 这在 2.3.0 中得到了改进)。

【讨论】:

  • 没有Await.resultAwait.ready 参与此错误。 但是你的回答给了我们一个提示。我们在消息中使用了Thread.sleep,现在我猜这是一种反模式。我们改用context.system.scheduler.scheduleOnce。这样情况就解决了。而且通常会出现一个新问题,但这属于一个新的 stackoverflow 问题!
  • 是的,很高兴你找到它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多