在 Akka Management Actor 的特殊情况下,因为该项目不依赖于 Akka Typed(因此涉及的 Actor 是 Classic Actor),您可以将您的 TypedActorContext视为 ClassicActorContext并使用ActorSelection.
根据您的问题,我猜测 Java (在 Scala 中,隐式使这变得不那么冗长,也许可以澄清意图):
akka.actor.typed.javadsl.Adapter.toClassic(context).actorSelection(path).resolveOne(timeout)
对于只想解析 Typed 本地参与者的情况,我发现最有效的策略是将解析功能合并到创建ActorSystem. 想要找到的演员将在 中注册,ActorSystem其他演员可以ActorSystem要求ActorRef。
这里的一个微妙之处是它context.getSystem()给了你一个ActorSystem<Void>which extends ActorRef<Void>。你可以通过调用来解决这个unsafeUpcast问题ActorSystem,例如
// Might not actually be syntactically valid Java, but hopefully the fix to make it
// legal is obvious...
ActorRef<MyActorSystemCommand> systemRef = context.getSystem().unsafeUpcast<MyActorSystemCommand>()
请注意,获取ActorSystem正确的消息类型非常重要:如果ActorSystem' 的行为不接受该类型的消息,则 Actor 系统将崩溃(据我所知,没有办法阻止 Actor 系统关闭)当您发送消息时。
这种方法的一个演变是定义一个在ActorSystem启动时产生的仅限本地的接待员演员:希望与该接待员交互的演员ActorRef通过上述方法获得它,然后该演员处理解决方案。
当然请注意,在这两种方法中(与 cluster-aware 一样Receptionist),只有明确选择像这样被解析的参与者才是可解析的。这与 Akka Typed 的一个基本主题是一致的:让演员更多地负责它向外界暴露的程度。