我有一个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]
我该如何解决这个问题?我必须在其他地方示例化这个参与者吗?
1条答案
按热度按时间6ju8rftf1#
Akka Classic和Akka Typed之间的阻抗不匹配。
Akka文档中对这种情况的一般建议是,当需要与经典代码共存时,使用经典ActorSystem。文档没有明确说明,但您可以生成类型化守护角色的行为,并使所有类型化角色都是该守护角色的子角色,因此,不要
你会有
这确实阻止了你输入的演员通过
context.system.unsafeUpcast
向守护者发送消息;除此之外,ActorSystem[T]
上唯一对T
有意义的操作是那些将其用作ActorRef[T]
的操作,因此这些操作仍然可以使用typedGuardian
,您只需要手动将其线程化即可(可以说,这比执行context.system.unsafeUpcast
更有信誉...)