我有一個使用基于此 TCP 連接示例的經典樣式的 akka 演員: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")
錯誤:
) java.lang.UnsupportedOperationException: 無法使用自定義用戶監護人在 ActorSystem 上從外部創建頂級演員 [clientActor] [錯誤] java.lang.UnsupportedOperationException: 無法使用自定義在 ActorSystem 上從外部創建頂級演員 [clientActor]用戶監護人
我怎樣才能解決這個問題?我必須在其他地方實體化這個演員嗎?
uj5u.com熱心網友回復:
您遇到了 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......)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/412160.html
標籤:
