我是Akka的全新人物,我正试图绕着SupervisorStrategies
和儿童演员终止。我有几个非常相似的问题。
首先,我的理解是,如果一个演员创建另一个演员(通过context.actorOf(...)
),那么它将自动成为演员的父母/主管。这是唯一的方式,演员可以成为另一个演员的/主管的父母。
如果我上面说的话不正确,请先纠正我!但是,假设我或多或少走上正轨,那么当多个父actor创建同一个子actor的实例时会发生什么:
// Groovy pseudo-code.
class Fizz extends UntypedActor {
@Override
void onReceive(Object message) {
ActorRef buzz = context.system.actorOf(Props.create(Buzz), "buzz")
buzz.tell("Hello buzz!", self)
}
}
class Foo extends UntypedActor {
@Override
void onReceive(Object message) {
ActorRef buzz = context.system.actorOf(Props.create(Buzz), "buzz")
buzz.tell("Meh!", self)
}
}
在上面的示例中,Fizz
和Foo
父对象是同一个Buzz
actor实例,还是两个Buzz
个实例?如果它是多个实例,我可以假设终止一个实例只会终止该实例吗?或者如果Foo
终止/停止其Buzz
个实例,那么这也会终止/停止Fizz
的实例吗?
答案 0 :(得分:2)
首先,这两者是不同的:
context.system.actorOf(Props.create(Buzz), "buzz")
context.actorOf(Props.create(Buzz), "buzz")
context.system.actorOf()
创建顶级用户角色。要创建子actor,您必须使用context.actorOf()
。答案的其余部分将假设您使用后一种方法。
是Fizz和Foo父母对同一个Buzz演员实例,
为false,从Buzz
创建的Foo
actor和从Buzz
创建的Fizz
是不同的实例,具有不同的父级。
您可以通过查看actor的路径来确认它。
由Buzz
创建的Foo
的路径类似akka://<system_name>/user/foo/buzz
,而Buzz
创建的Fizz
的路径类似于akka://<system_name>/user/fizz/buzz
(我不使用java,但也许你可以通过类似getPath()
或ActorRef
的{{1}}方法来获取演员路径
此外,由Actor
创建的Buzz
actor的路径类似于context.system.actorOf()
,它由User Guardinan actor直接监督。
所以actor路径之间的关系是:
akka://<system_name>/user/buzz
(akka://<system_name>/user/fizz/buzz
的实例)由Buzz
监管(akka://<system_name>/user/fizz
的实例)Fizz
(akka://<system_name>/user/foo/buzz
的另一个实例)由Buzz
(akka://<system_name>/user/foo
的实例)监督。因此,您的主要问题是:
我可以假设终止一个实例只会终止该实例吗?或者,如果Foo终止/停止其Buzz实例,那么这也会终止/停止Fizz的实例吗?
前者是正确的。
阅读akka文档了解更多详情: