我需要另一个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
--我认为这不是一个干净的实现(如果我错了,请纠正我)
1条答案
按热度按时间z2acfund1#
如果我理解你的意思,你想用
ActorSystem
的引用来产生演员。每个参与者可以通过其
ActorContext
获得对其ActorSystem
的引用;ActorContext
通常是通过使用Behaviors.setup
注入的。您可以通过在ActorContext
上调用getSystem()
来获取ActorSystem
。请注意,它是一个ActorSystem<Void>
,但由于它真正使用其类型参数的唯一方式是在您将其用作ActorRef
时,可以使用unsafeUpcast()
方法。注意,unsafeUpcast
不会以任何方式验证强制类型转换是否有效,但由于通常不会对类型产生混淆(在典型的应用程序中只有一个ActorSystem
),因此这通常不是问题;如果进行了不正确的强制转换,则会导致在发送消息时系统崩溃。当一个
Actor1
想要产生一个演员作为守护者的孩子时(老实说,我不确定什么时候你会想从另一个演员的内部这样做:SpawnProtocol
的目的是用于参与者之外的代码),您只需将SpawnProtocol.Spawn
发送到systemGuardian
。同样值得注意的是,
SpawnProtocol
可以由非监护人的参与者来处理:监护行动者可以产生处理X1 M18 N1 X的行动者,并提供对该行动者的REF,作为产生将不是请求者的孩子的行动者的手段。请注意,
ActorSystem
的ActorRef
是守护角色,当您执行system.tell(new SpawnProtocol.Spawn...)
时,守护角色将派生角色。