如何在Akka中实现基于Actor的HTTP路由

时间:2018-01-29 12:02:00

标签: scala akka akka-http macwire

我是Akka的新手。在学习的同时,我在Github创建了一个示例项目。此项目使用AkkaAkka-HTTPSlickFlywayMacwire。我想为HTTP路由实现Akka Actors。我尝试在redis/上实现此功能但未按预期工作。

目前Controller的工作方式为:

class AuthController(userService: UserService[Future]) extends Controller {

  import de.heikoseeberger.akkahttpjson4s.Json4sSupport._
  implicit val serialization: Serialization.type = jackson.Serialization // or native.Serialization
  implicit val formats: DefaultFormats.type = DefaultFormats

  override def route: Route = pathPrefix("users") {
    pathEndOrSingleSlash {
      register
    }
  }

  private def register = {
    (post & entity(as[RegistrationData])) { registrationData =>
      complete(userService.registerUser(registrationData))
    }
  }

}

但是我试图在现有代码中进行一些更改来实现类似的东西:

class AuthController(userhandler: ActorRef) extends Controller {

  import de.heikoseeberger.akkahttpjson4s.Json4sSupport._
  implicit val serialization: Serialization.type = jackson.Serialization // or native.Serialization
  implicit val formats: DefaultFormats.type = DefaultFormats

  override def route: Route = pathPrefix("users") {
    pathEndOrSingleSlash {
      register
    }
  }

  private def register = {
    (post & entity(as[RegistrationData])) { registrationData =>
      complete(
        (userHandler ? UserHandler.Register(registrationData)).map {
          case true => OK -> s"Thank you ${registrationData.username}"
          case _ => InternalServerError -> "Failed to complete your request. please try later"
        }
      )
    }
  }

}

任何人都可以建议我如何实施上述内容?感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在提出此类问题时,请提供您所看到的错误。在这里,我假设它是关于缺少执行上下文(为了运行Future)以及Timeout,请阅读有关ask(AKA ?)模式的更多信息: https://doc.akka.io/docs/akka/2.5/actors.html#ask-send-and-receive-future

一般而言,您所遗失的内容(因为不确定您的问题到底是什么)可以通过以下方式解决:

import system.dispatcher // The ExecutionContext that will be used

系统是一个演员系统,并且:

implicit val timeout = Timeout(5 seconds) // needed for below

您可以从路线中extract an ActorSystem instance以及btw: