2013-01-12 114 views
6

我的应用程序需要能够创建角色的树结构。我想象的标准方法是将实例化代码放入参与者中,以便他们可以实例化他们的孩子。我宁愿的做法是能够在给定路径上实例化一个actor。比如在mySystem中创建actor A,然后能够直接创建akka:// mySystem/A/B和其他actor。这种功能是否存在?它会大大简化我的代码。在akka中手动创建角色层次结构

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

说我有一个类

class myActor extends actor 

,我需要做的这些n路树。而不必用什么实例自己的孩子在接收功能类似

case Create(n:Int) => {} 

我希望通过不包括任何的,为了简化myActor代码所需的代码,而是能够在开始创建我的层次我的代码手动。因此,理想的是这样的(假设假设静态功能 “创建”):

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()) 

这将创建actor树:

a 
/\ 
b c 

现在,这是否存在?有没有更好的方式来做到这一点,而不用实例化代码混淆我的actor代码?

编辑,第2轮:

好吧,看起来像这个功能不存在。我创建了一个actor的子特性,并强制所有实例化代码放在那里,这样我的具体实现类仍然很整洁。

回答

2

每个演员都有一位家长。要做你想做的事,你需要一个Actor类作为所有其他actor(不是根actor)的父类。由于父母行为者与监督行为者是同义词,因此你需要有一些手段来指导适用于这些父母行为者的监督策略。

我想你可以定义一个通用父项Actor放置到actor层次结构的内部位置,并编写一个方法来分解一个actor路径名并创建由一个或多个这些路径指定的层次结构。您可能需要一种方法来指定监督策略,并且最低限度地要安装在叶演员中的receive函数。

由于只有演员可以创建自己的子项,所以父演员将不得不响应创建其子演员(其他父演员或叶演员)的消息,以某种方式选择要实例化的子类叶演员。

但回答你的问题,没有什么内置的做到这一点。我认为它没有足够的通用性来证明将其添加到Akka本身。

2

创建根演员,根据演员创建您的树与actorFor。在类路径中使用application.conf进行名称层次结构的静态配置,或者创建一些常量地址结构。另一个选项是解析路径并在覆盖preStart中创建子项。监督儿童生命周期有不同的方案,通过一名演员透明地重新启动和路由消息。

4

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

演员树最重要的是被理解为监督层级:父母处理孩子的失败和父母的生命周期限制在其子女的生命周期中。无论演员是否应该是另一个演员的孩子,都需要通过考虑这些影响来确定。

我说因为你的问题意味着你正在根据其他标准对监督树进行建模,所以很可能将它作为注册表滥用为system.actorFor作为查找机制。有些情况下可能会出现这种情况,但我不会推荐它。我宁愿把一个哈希映射放在一个调度员的角色里面,并处理查找。如果您通过测量得出结论 - 性能不够好,您可以使用router进行扩展。

现在回答你的问题:每个父母都需要创建自己的孩子,这意味着它必须以某种方式包含代码才能做到这一点。您可以将Props传递给层次结构以使其中的一部分可配置,但您不应该在what supervision means附近工作;问问自己,如果其中一片树叶失效会发生什么,然后问自己,当重新启动中间角色时,是否应该重启和/或杀死假定的树叶。

+0

我从理论上可以看出这是一个很好的答案,但是我不禁注意到,大型演员系统层次结构产生了多少意大利面代码。问题中提到的中心配置可能为实际软件目的提供清晰理解总体层次结构的机制。你会推荐一些替代方法来阐明复杂的层次结构吗?或者这是如何得到父母与孩子的演员关系? –

+0

我很难回答这个问题,因为你似乎暗示了我没有的背景。 Actor系统在提供某些功能的子树中构建,从这个意义上说,它们是非常模块化的。每个这些子模块的入口点都是它的顶级角色,它实际上是其整个子树。我可以看到如何通过尝试在外部子树中安装actor来生成意大利面代码,因为这根本不是意味着要完成的。每当演员需要创建一个孩子时,例如,可以查看配置以确定如何执行此操作。 –