代码之家  ›  专栏  ›  技术社区  ›  Eric Kolotyluk

Akka HTTP与Akka类型一起工作吗?

  •  5
  • Eric Kolotyluk  · 技术社区  · 6 年前
    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)
    

    可以编译,但当我运行代码时

    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
    

    有什么简单的解决方法吗?我怎么能给 Http() ActorSystem需要什么?

    Akka类型似乎还不能很好地与其他Akka库配合使用

    1 回复  |  直到 6 年前
        1
  •  6
  •   Michal Borowiecki    6 年前

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

    import akka.actor.typed.scaladsl.adapter._
    
    val bindingFuture = Http(actorContext.system.toUntyped).bindAndHandle(route, "localhost", 8888)
    

    下面是一个测试类似情况是否有效的示例:

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