Akka监管策略与终止
我是Akka的新员工,我正试图了解主管策略和儿童演员终止。我有几个非常相似的担忧 首先,我的理解是,如果一个参与者创建了另一个参与者(通过Akka监管策略与终止,akka,akka-supervision,akka-actor,Akka,Akka Supervision,Akka Actor,我是Akka的新员工,我正试图了解主管策略和儿童演员终止。我有几个非常相似的担忧 首先,我的理解是,如果一个参与者创建了另一个参与者(通过context.actorOf(…)),那么它将自动成为该参与者的家长/主管。这是演员成为另一个演员的家长/主管的唯一方式 如果我上面所说的任何错误,请先纠正我!但是,假设我或多或少已经走上正轨,那么当多个父角色创建同一个子角色的实例时会发生什么情况: // Groovy pseudo-code. class Fizz extends UntypedActor
context.actorOf(…)
),那么它将自动成为该参与者的家长/主管。这是演员成为另一个演员的家长/主管的唯一方式
如果我上面所说的任何错误,请先纠正我!但是,假设我或多或少已经走上正轨,那么当多个父角色创建同一个子角色的实例时会发生什么情况:
// 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
演员实例的父母,还是两个Buzz
的父母?如果是多个实例,我可以假设终止一个实例只会终止该实例吗?或者如果Foo
终止/停止其Buzz
实例,是否也会终止/停止Fizz
的实例?首先,这两个实例是不同的:
context.system.actorOf(Props.create(Buzz), "buzz")
context.actorOf(Props.create(Buzz), "buzz")
context.system.actorOf()
创建顶级用户参与者。为了创建子actor,必须使用context.actorOf()
。答案的其余部分将假定您使用后一种方法
Akka的演员监督系统是分层的。
这意味着每个参与者只有一位家长。
所以你的问题是:
Fizz和Foo是同一Buzz演员的父母吗
如果为false,则从Foo
创建的Buzz
演员和从Fizz
创建的Buzz
是不同的实例,具有不同的父实例
您可以通过查看参与者的路径来确认它。
Foo
创建的Buzz
的路径类似于akka:///user/foo/buzz和由Fizz
创建的Buzz
的路径类似于akka:///user/fizz/buzz
(我不使用java,但也许您可以通过getPath()
方法ActorRef
或actor
获取actor路径)
此外,由context.system.actorOf()
创建的Buzz
参与者的路径类似于akka:///user/buzz
,由演员直接监督
因此,参与者路径之间的关系是:
akka:///user/fizz/buzz(嗡嗡声的安装)由akka:///user/fizz
(Fizz
的实例)
akka:///user/foo/buzz(另一个Buzz
实例)由akka:///user/foo
(Foo
的实例)
因此,你的主要问题是:
我可以假设终止一个实例只会终止该实例吗?或者,如果Foo终止/停止其Buzz实例,是否也会终止/停止Fizz的实例
前者是正确的
有关更多详细信息,请阅读akka文档:
感谢@ymonad(+1)提供的帮助-你能确认我的说法吗,即创造一个儿童演员会让你成为他的父母?我只是担心家长可能需要进行一些API调用,以便将儿童演员“绑定”到该API,等等。再次感谢@smeeb不,不需要额外的API来绑定演员的孩子。只需在actor内部调用context.actorOf()
,即可创建新的子actor。