首页 > 解决方案 > 可以将 ActorContext (getContext()) 传递到 Actor 外部以创建子 Actor 吗?

问题描述

我想要一个 ActorFactory 类如下

public class SampleActorFactory {
  // Simple create method
  public createActor(AbstractActor.ActorContext actorContext, Props props) {
     return actorContext.actorOf(props);
  }
 // other complex create methods
 ...
}

使用上述工厂类创建子actor是否可以,或者这被认为是一种不好的做法?如果被认为是不好的做法,那为什么?

例如:

public class SampleActor extends AbstractActor {
 private final SampleActorFactory sampleActorFactory;
 @Override 
 public Receive createReceive() {
        return receiveBuilder()
            .match(SampleData.class, sampleData -> {
              Props sampleProps = getSampleProps(...);
              ActorRef childActor = sampleActorFactory.createActor(getContext(), sampleProps);
            })
            .build();

    }
}

标签: javaakkaakka-actor

解决方案


我认为这种方法没有任何问题,您应该能够访问参与者系统之外的上下文。但是....通常要创建一个演员,您只需要如下一行代码。使用您的代码,您必须在创建演员的地方编写两行代码(一行用于 Props,另一行用于调用您的 createActor() 方法)。除了实现工厂方法之外,如果您从中获得任何额外的好处,您可以选择它。

ActorRef demoActor = getContext().system().actorOf(Props.create(MyDemoActor.class, prop1, prop2);

推荐阅读