akka 使用Spawn协议,来自守护者操作者的命令

qzwqbdag  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(228)

我需要另一个actor中的ActorSystem<SpawnProtocol.Command>。我希望GuardianActor有一个对ActorSystem<SpawnProtocol.Command>的引用,这样我就可以在使用守护者Actor生成actor时传递这个引用,有什么方法可以做到这一点吗?我看不出这是可能的,因为我们只有在创建actor系统和守护者之后才能得到ActorSystem<SpawnProtocol.Command>

ActorSystem<SpawnProtocol.Command> system = ActorSystem.create(GuardianActor.create(), "System", config)

我看到的唯一选择就是

system.tell(new SpawnProtocol.Spawn<>(NewActor.create(system)), "NewActor", Props.empty(), system.ignoreRef());

在这种情况下,我不会使用守护者角色来生成NewActor--我认为这不是一个干净的实现(如果我错了,请纠正我)

z2acfund

z2acfund1#

如果我理解你的意思,你想用ActorSystem的引用来产生演员。
每个参与者可以通过其ActorContext获得对其ActorSystem的引用; ActorContext通常是通过使用Behaviors.setup注入的。您可以通过在ActorContext上调用getSystem()来获取ActorSystem。请注意,它是一个ActorSystem<Void>,但由于它真正使用其类型参数的唯一方式是在您将其用作ActorRef时,可以使用unsafeUpcast()方法。注意,unsafeUpcast不会以任何方式验证强制类型转换是否有效,但由于通常不会对类型产生混淆(在典型的应用程序中只有一个ActorSystem),因此这通常不是问题;如果进行了不正确的强制转换,则会导致在发送消息时系统崩溃。

// Apologies, my Java is pretty rusty
public class Actor1 extends AbstractBehavior<Actor1.Command> {
    public static Behavior<Command> create(int x) {
        return Behaviors.setup(context -> new Actor1(context, x));
    }

    private int x;
    private final ActorRef<SpawnProtocol.Command> systemGuardian;

    private Actor1(ActorContext<Command> context, int x) {
        super(context);

        this.x = x;
        // If doing an unsafeUpcast on the ActorSystem and there's a message
        // which will do nothing in its protocol, it might be a good idea to
        // send that message eagerly, so everything crashes quickly...
        systemGuardian = context.getSystem().unsafeUpcast<SpawnProtocol.Command>()
    }
}

当一个Actor1想要产生一个演员作为守护者的孩子时(老实说,我不确定什么时候你会想从另一个演员的内部这样做:SpawnProtocol的目的是用于参与者之外的代码),您只需将SpawnProtocol.Spawn发送到systemGuardian
同样值得注意的是,SpawnProtocol可以由非监护人的参与者来处理:监护行动者可以产生处理X1 M18 N1 X的行动者,并提供对该行动者的REF,作为产生将不是请求者的孩子的行动者的手段。
请注意,ActorSystemActorRef是守护角色,当您执行system.tell(new SpawnProtocol.Spawn...)时,守护角色将派生角色。

相关问题