Почему этот Scala код Akka не компилируется? - PullRequest
0 голосов
/ 11 февраля 2020

Я получаю эту ошибку компиляции, которую я не понимаю:

[error] /Users/nicu/mooc-reactive/akkahttp-typed-actors-cluster-ORMap-followers/src/main/scala/followers/HttpServer.scala:43:76: type mismatch;
[error]  found   : akka.actor.typed.ActorRef[Res] => Req
[error]     (which expands to)  akka.actor.typed.ActorRef[scala.collection.immutable.Map[followers.UserId,followers.User]] => followers.FollowCommand
[error]  required: akka.actor.typed.ActorRef[Res] => Map[followers.UserId,followers.User]
[error]     (which expands to)  akka.actor.typed.ActorRef[scala.collection.immutable.Map[followers.UserId,followers.User]] => Map[followers.UserId,followers.User]
[error]             val usersStateFuture: Future[Res] = followersActorRef.ask[Res](func)

На мой взгляд, эта подпись:

def ask[Res](replyTo: ActorRef[Res] => Req)(implicit timeout: Timeout, scheduler: Scheduler): Future[Res]  

должна просто означать, что временный актер будет создал, типа ActorRef [Res], и функцию replyTo можно использовать для создания сообщения для целевого субъекта таким образом, чтобы он включал ссылку на ответ временному действующему субъекту, который затем при получении выполнит обещание, таким образом, возвращаемое будущее будет дополнить Res. В моем случае сообщение (Req) - это команда, точнее FollowCommand, а ответ (Res) - это карта [UserId, пользователь] с текущим состоянием, которым управляет целевой объект.

Я не могу просто понимаю, почему он не компилируется, спасибо.

package followers

import akka.Done
import akka.actor.typed.scaladsl.Behaviors
import akka.actor.typed.scaladsl.adapter._
import akka.actor.typed.{ActorRef, ActorSystem, Behavior, Scheduler}
import akka.http.scaladsl.Http
import akka.http.scaladsl.server.Route
import akka.http.scaladsl.server.directives.PathDirectives._
import akka.util.Timeout

import scala.concurrent.Future

object HttpServer {
  val guardianBehavior: Behavior[Done] = Behaviors.setup[Done](context => {
    val followersGraphActorRef = context.spawn(FollowersData.defaultBehavior(Map()), "followersGraph")
    context.watch(followersGraphActorRef)
    Http()(context.system.toClassic).bindAndHandle(route(followersGraphActorRef), "localhost", 8080)
    Behaviors.receiveMessage {
      case Done => Behaviors.stopped
    }
  })
  val system: ActorSystem[Done] = ActorSystem[Done](guardianBehavior, "demo-system")

  def route(followersActorRef: ActorRef[Map[UserId, User]]): Route =
    pathPrefix("root") {
      import akka.http.scaladsl.server.Directives._
      import akka.http.scaladsl.server.directives.MethodDirectives.get
      import akka.http.scaladsl.server.directives.PathDirectives.path
      import akka.http.scaladsl.server.directives.RouteDirectives.complete
      concat(
        pathEnd {
          get {
            import akka.actor.typed.scaladsl.AskPattern._
            import scala.concurrent.duration._
            implicit val timeout: Timeout = Timeout(5.seconds) // usually we'd obtain the timeout from the system's configuration
            implicit val scheduler: Scheduler = system.scheduler
            type Res = Map[UserId, User]
            type Req = FollowCommand
            val func: ActorRef[Res] => Req = (replyTo: ActorRef[Map[UserId, User]]) =>  FollowCommand(UserId(1), UserId(2), replyTo)

//            def ask[Res](replyTo: ActorRef[Res] => Req)(implicit timeout: Timeout, scheduler: Scheduler): Future[Res] = {
            val usersStateFuture: Future[Res] = followersActorRef.ask[Res](func)
            onSuccess(usersStateFuture)(usersState =>
              complete(usersState.toString)) //todo json
          }
        }
        //        path(Segment) {
        //          case "segment1" =>
        //        }
      )
    }


}

1 Ответ

1 голос
/ 11 февраля 2020

Причиной был тип актера, на которого я звонил, спрашиваю. Этот актер после исправления имеет тип ActorRef [Req], конечно. Актеры имеют запрос в своем типе (какие типы сообщений они могут получать). Ранее это было в коде выше ActorRef [Response].

...