6

我的应用程序需要能够创建演员的树形结构。我想这样做的标准方法是将实例化代码放在演员中,以便他们可以实例化他们的孩子。我宁愿采用的方法是能够在给定路径上实例化一个演员。比如在mySystem中创建actor A,然后可以直接创建akka://mySystem/A/B等actor。是否存在这样的功能?这将大大简化我的代码。

编辑:现在我不在手机上,让我详细说明一下。

说我有课

class myActor extends actor

我需要制作这些的n路树。而不是在接收函数中实例化自己的孩子所需的代码,例如

case Create(n:Int) => {}

我希望通过不包含任何内容来简化 myActor 代码,而是能够在我的代码开头手动创建我的层次结构。所以理想情况下是这样的(假设假设静态函数“create”):

val sys = ActorSystem("mySystem")
Akka.Actors.Create("akka://mySystem/a", new myActor())
Akka.Actors.Create("akka://mySystem/a/b", new myActor())
Akka.Actors.Create("akka://mySystem/a/c", new myActor())

这将创建演员树:

  a
 / \
b   c

现在,这存在吗?有没有更好的方法来做到这一点,而不会使我的演员代码与实例化代码混淆?

编辑,第 2 轮:

好的,看起来这个功能不存在。相反,我创建了一个 actor 的子特征,并将我所有的实例化代码强制放入其中,这样我的具体实现类仍然很整洁。

4

3 回答 3

4

您的问题从解决方案的假设开始,不幸的是它不包括对问题的描述。

Actor 树首先被理解为监督层次结构:父级处理其子级的故障,父级的生命周期限制其子级的生命周期。一个演员是否应该是另一个演员的孩子需要通过考虑这些含义来确定。

我这么说是因为您的问题暗示您正在根据其他一些标准对监督树进行建模,很可能将其滥用为具有system.actorFor查找机制的注册表。可能在极少数情况下有效,但我不建议先验;我宁愿在调度员演员中放置一个散列图并让它处理查找。如果您通过测量得出结论认为其性能不够好,您可以使用路由器扩大规模。

现在回答您的问题:每个父母都需要创建自己的孩子,这意味着它必须以一种或另一种方式包含执行此操作的代码。您可以Props向下传递层次结构以使其部分可配置,但您不应该解决监督的含义;问问自己如果其中一个叶子失败了会发生什么,然后问自己当中间参与者重新启动时,是否应该重新启动和/或杀死假定的叶子。

于 2013-01-13T20:16:08.287 回答
2

Create root actor, from within root actor create your tree with actorFor. Use application.conf in classpath for static configuration of hierarchy of names, or create some constant structure of addresses. The other option is parse paths and create children in overriden preStart. There are different schemes for supervising children lifecycle, do restart and routing messages transparently through a single actor.

于 2013-01-12T04:24:50.640 回答
2

每个演员都有父母。为了做你想做的事,你需要一个Actor类作为所有其他演员(除了根演员)的父级。由于父 Actor 是监督 Actor 的同义词,因此您需要有一些方法来指定应用于这些父 Actor 的监督策略。

我想您可以定义一个通用父Actor级以放置到参与者层次结构的内部位置并编写一个方法来分解参与者路径名称并创建由一个或多个这些路径决定的层次结构。您可能想要一种方法来指定监督策略,并且至少receive需要在叶子参与者中安装的功能。

由于只有一个actor可以创建它的子actor,父actor必须响应创建子actor(其他父actor或叶子actor)的消息,以某种方式Actor为叶子actor选择要实例化的子类。

但是要回答你的问题,没有内置的东西可以做到这一点。我认为它没有足够的通用性来证明将其添加到 Akka 本身是合理的。

于 2013-01-12T02:34:03.747 回答