尝试从akka类型的应用程序内部创建一个经典角色

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

我有一个akka演员,他使用的是基于这个TCP连接示例的经典风格:https://doc.akka.io/docs/akka/current/io-tcp.html
我尝试从一个akka类型化的应用程序中示例化这个参与者(因为我找不到使用类型化的完全相同的TCP连接的示例-不确定API是否可用?)

implicit val system = ActorSystem(SomeActor(), "typed-actorSystem")   // import akka.actor.typed.ActorSystem

val remote = new InetSocketAddress(config.host, config.port)

val client =
    system.classicSystem.actorOf(Client.props(remote), "clientActor")

错误:
异常错误:无法在具有自定义用户监护人的ActorSystem上从外部创建顶级执行元[clientActor][错误] java.lang.UnsupportedOperationException:无法在具有自定义用户监护人的ActorSystem上从外部创建顶级执行元[clientActor]
我该如何解决这个问题?我必须在其他地方示例化这个参与者吗?

6ju8rftf

6ju8rftf1#

Akka Classic和Akka Typed之间的阻抗不匹配。
Akka文档中对这种情况的一般建议是,当需要与经典代码共存时,使用经典ActorSystem。文档没有明确说明,但您可以生成类型化守护角色的行为,并使所有类型化角色都是该守护角色的子角色,因此,不要

// typed: guardianBehavior is a Behavior[T], so system is an ActorSystem[T]
val system = ActorSystem(guardianBehavior, "my-actor-system")

你会有

import akka.actor.typed.scaladsl.adapter.ClassicActorSystemOps

// A classic actor system
val system = ActorSystem("my-actor-system")

// Typed guardian, will be in the parental chain of all typed actors
val typedGuardian = system.spawn(guardianBehavior, "typed-guardian")

这确实阻止了你输入的演员通过context.system.unsafeUpcast向守护者发送消息;除此之外,ActorSystem[T]上唯一对T有意义的操作是那些将其用作ActorRef[T]的操作,因此这些操作仍然可以使用typedGuardian,您只需要手动将其线程化即可(可以说,这比执行context.system.unsafeUpcast更有信誉...)

相关问题