代码之家  ›  专栏  ›  技术社区  ›  Chaitanya

特性中的Akka

  •  1
  • Chaitanya  · 技术社区  · 8 年前

    我有一个扩展App的对象,我在其中创建了Actor系统和Actor Materializer,还创建了给定Actor系统下的Actor。

    object QuickstartServer extends App with UserRoutes {
    
      implicit val system: ActorSystem = ActorSystem("helloAkkaHttpServer")
      implicit val materializer: ActorMaterializer = ActorMaterializer()
    
      val userRegistryActor: ActorRef = system.actorOf(UserRegistryActor.props, "userRegistryActor")
    
    
       lazy val routes: Route = userRoutes
          Http().bindAndHandle(routes, "localhost", 8080)
        }
    

    现在UserRoutes包含了所有的路由

    trait UserRoutes extends JsonSupport {
    
      implicit def system: ActorSystem
      lazy val log = Logging(system, classOf[UserRoutes])
      def userRegistryActor: ActorRef
    
      lazy val userRoutes: Route =
        pathPrefix("users") {
          concat(
            pathEnd {
              concat(
                get {
                  val users: Future[Users] =
                    (userRegistryActor ? GetUsers).mapTo[Users]
    //Remaining code 
    

    userRegistryActor

    你可以在这里找到完整的代码 https://developer.lightbend.com/guides/akka-http-quickstart-scala/backend-actor.html

    1 回复  |  直到 8 年前
        1
  •  3
  •   C4stor    8 年前

    在trait的开头,您可以看到以下两个声明:

      implicit def system: ActorSystem
      def userRegistryActor: ActorRef
    

    这两个是trait中的抽象声明,意味着trait的实现必须提供这两个声明。

    这就是对象中发生的事情,有两个声明:

     implicit val system: ActorSystem = ActorSystem("helloAkkaHttpServer")
     val userRegistryActor: ActorRef = system.actorOf(UserRegistryActor.props, "userRegistryActor")
    

    相当一部分开发人员建议通过添加override关键字使这种实现更加明确,如下所示:

     override implicit val system: ActorSystem = ActorSystem("helloAkkaHttpServer")
     override val userRegistryActor: ActorRef = system.actorOf(UserRegistryActor.props, "userRegistryActor")