Akka HTTP是否可以与Akka Typed一起使用?

Eri*_*luk 5 scala akka akka-http akka-typed

val behavior: Behavior[Message] = Behaviors.setup {
  actorContext ?
    logger.info("starting...")

    implicit val actorSystem = actorContext.system.asInstanceOf[ActorSystem]
    implicit val materializer = ActorMaterializer()(actorContext.asInstanceOf[ActorContext])
    implicit val executionContext = actorContext.executionContext

    val route =
      path("hello") {
        get {
          complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, "<h1>Say hello to akka-http</h1>"))
        }
      }

    val bindingFuture = Http().bindAndHandle(route, "localhost", 8888)
Run Code Online (Sandbox Code Playgroud)

可以编译,但是当我运行代码时,我得到了

20:44:22.586 [Leaderboard-akka.actor.default-dispatcher-3] INFO net.kolotyluk.leaderboard.service.REST$ - starting...
[ERROR] [04/02/2018 20:44:22.592] [Leaderboard-akka.actor.default-dispatcher-2] [akka://Leaderboard/user/Http]
akka.actor.typed.internal.adapter.ActorSystemAdapter cannot be cast to akka.actor.ActorSystem
akka.actor.ActorInitializationException: akka://Leaderboard/user/Http: exception during creation
Run Code Online (Sandbox Code Playgroud)

有一些简单的解决方案吗?如何提供Http()ActorSystem所需的资源?

Akka Typed似乎不能与其他Akka库一起使用

Mic*_*cki 5

您的代码似乎将类型化的ActorSystem强制转换为未类型化的ActorSystem,因此出现错误。而是使用适配器:

import akka.actor.typed.scaladsl.adapter._

val bindingFuture = Http(actorContext.system.toUntyped).bindAndHandle(route, "localhost", 8888)
Run Code Online (Sandbox Code Playgroud)

这是一个测试类似功能的示例:

https://github.com/akka/akka-http/blob/bb682d39b0eb570e74f837829d0f9c13eeea2299/akka-http-tests/src/test/scala/akka/http/scaladsl/TypedActorSystemSpec.scala#L17

  • 看来 `toUntyped` 已被替换为 `toClassic` (2认同)