0

我是 Akka 的新手,正在努力解决SupervisorStrategies和终止儿童演员的问题。我有几个非常相似的担忧。

首先,我的理解是,如果一个演员创建另一个演员(通过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)
    }
}

在上面的例子中,FizzFoo父母是同一个Buzzactor实例,还是两个实例Buzz?如果是多个实例,我可以假设终止一个实例只会终止该实例吗?或者,如果Foo终止/停止其Buzz实例,那是否也会终止/停止Fizz的实例?

4

1 回答 1

2

首先这两个是不同的:

context.system.actorOf(Props.create(Buzz), "buzz")
context.actorOf(Props.create(Buzz), "buzz")

context.system.actorOf()创建顶级用户actor。为了创建子演员,您必须使用context.actorOf(). 其余的答案将假设您使用后一种方法。

Akka 的 actor 监督系统是分层的。这意味着每个演员只有一个父母。所以你的问题:

Fizz 和 Foo 是同一个 Buzz 演员实例的父母,

为假,Buzzactor 创建自FooBuzz创建自Fizz,是不同的实例,具有不同的父级。

您可以通过查看演员的路径来确认。 BuzzFoohas path 之类的创建,并由akka://<system_name>/user/foo/buzzhas path 之类的创建BuzzFizzakka://<system_name>/user/fizz/buzz

(我不使用java,但也许你可以通过类似getPath()的方法来获取演员路径ActorRefor Actor

此外,Buzz由创建的 actorcontext.system.actorOf()具有类似 的路径akka://<system_name>/user/buzz,由User Guardinan actor 直接监督。

所以actor路径之间的关系是:

  • akka://<system_name>/user/fizz/buzz(instace of Buzz) 由akka://<system_name>/user/fizz(Instance of Fizz)监督
  • akka://<system_name>/user/foo/buzz( 的另一个实例Buzz) 由akka://<system_name>/user/foo( 的实例) 监督Foo

因此,您的主要问题:

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

前者是正确的。

阅读 akka 文档以获取更多详细信息:

于 2015-08-21T05:01:24.317 回答