我的应用程序需要能够创建actor的树结构。我想象的标准方法是将实例化代码放在actor中,这样他们就可以实例化他们的孩子。我宁愿的方法是能够在给定路径上实例化一个actor。比如在mySystem中创建actor A然后能够直接创建akka:// mySystem / A / B和其他actor。这样的功能是否存在?它会大大简化我的代码。
编辑:现在我不在手机上,让我详细说明。说我有一个班级
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的子特性并强制我的所有实例化代码,以便我的具体实现类仍然很整洁。
答案 0 :(得分:4)
您的问题始于解决方案的假设,遗憾的是,它不包含对问题的描述。
演员树最重要的是被理解为监督层次结构:父母处理其子女的失败以及父母在其子女生命周期中的生命周期。演员是否应该成为另一个演员的孩子需要通过考虑这些影响来确定。
我这样说是因为你的问题暗示你是根据其他一些标准对监督树进行建模,很可能将其作为注册表滥用system.actorFor
作为查找机制。可能有极少数情况可行,但先验我不推荐它;我宁愿在调度程序actor中放入一个哈希映射,并让它处理查找。如果您通过衡量结果表示效果不佳,则可以使用router进行扩展。
现在回答你的问题:每个父母都需要创建自己的孩子,这意味着它必须以某种方式包含代码才能做到这一点。您可以在层次结构中向下传递Props
以使其中的部分内容可配置,但您不应该使用what supervision means;问问自己,如果其中一片叶片出现故障会发生什么,然后问问自己,当重新启动中间演员时,是否应该重新启动和/或杀死你的假定叶子。
答案 1 :(得分:2)
每个演员都有父母。要做你想做的事,你需要一个Actor
类作为所有其他actor(除了root actor)的父级。由于父母演员是监督演员的同义词,你需要有一些方法来指示监督策略适用于那些父演员。
我想你可以定义一个通用父Actor
放置到actor层次结构的内部位置,并编写一个方法来分解一个actor路径名并创建一个或多个路径所指示的层次结构。您可能想要一种方法来指定监督策略,并且最低限度地要在叶子actor中安装receive
函数。
由于只有一个actor可以创建它的子节点,所以父actor必须响应用于创建子actor(其他父actor或叶子actor)的消息,以某种方式提出一种方法来选择哪个Actor
子类为叶子演员实例化。
但要回答你的问题,没有内置的东西可以做到这一点。我不认为它有足够的通用效用来证明将其添加到Akka本身。
答案 2 :(得分:2)
从root actor中创建root actor,使用actorFor
创建树。在类路径中使用application.conf
进行名称层次结构的静态配置,或者创建一些常量的地址结构。另一个选项是解析路径,并在覆盖preStart
中创建子项。监督子生命周期有不同的方案,通过单个actor透明地重启和路由消息。