Ciò può essere ottenuto con una combinazione della direttiva onComplete
e del modello ask.
Nell'esempio seguente l'attore RequestHandlerActor
viene utilizzato per creare uno HttpResponse
basato su HttpRequest
. Questo attore viene invitato dall'interno del percorso.
Non ho mai usato Java per il codice di routing, quindi la mia risposta è in Scala.
import scala.concurrent.duration._
import akka.actor.ActorSystem
import akka.http.scaladsl.model.HttpResponse
import akka.http.scaladsl.model.HttpRequest
import akka.actor.Actor
import akka.http.scaladsl.server.Directives._
import akka.actor.Props
import akka.pattern.ask
import akka.util.Timeout
import scala.util.{Success, Failure}
import akka.http.scaladsl.model.StatusCodes.InternalServerError
class RequestHandlerActor extends Actor {
override def receive = {
case httpRequest : HttpRequest =>
sender() ! HttpResponse(entity = "actor responds nicely")
}
}
implicit val actorSystem = ActorSystem()
implicit val timeout = Timeout(5 seconds)
val requestRef = actorSystem actorOf Props[RequestHandlerActor]
val route =
extractRequest { request =>
onComplete((requestRef ? request).mapTo[HttpResponse]) {
case Success(response) => complete(response)
case Failure(ex) =>
complete((InternalServerError, s"Actor not playing nice: ${ex.getMessage}"))
}
}
Questo percorso può quindi essere utilizzata passato nel metodo bindAndHandle
come qualsiasi altro flusso.
fonte
2016-01-17 23:27:49