Я получаю эту ошибку компиляции, которую я не понимаю:
[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" =>
// }
)
}
}