Akka监督策略和终止

时间:2015-08-21 01:57:26

标签: akka actor supervisor

我是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)
    }
}

在上面的示例中,FizzFoo父对象是同一个Buzz actor实例,还是两个Buzz个实例?如果它是多个实例,我可以假设终止一个实例只会终止该实例吗?或者如果Foo终止/停止其Buzz个实例,那么这也会终止/停止Fizz的实例吗?

1 个答案:

答案 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/buzzakka://<system_name>/user/fizz/buzz的实例)由Buzz监管(akka://<system_name>/user/fizz的实例)
  • Fizzakka://<system_name>/user/foo/buzz的另一个实例)由Buzzakka://<system_name>/user/foo的实例)监督。

因此,您的主要问题是:

  

我可以假设终止一个实例只会终止该实例吗?或者,如果Foo终止/停止其Buzz实例,那么这也会终止/停止Fizz的实例吗?

前者是正确的。

阅读akka文档了解更多详情: