In developing @jrudolph's comment, the code below satisfies your requirements for sending RequestContext values ββto an Actor. Your question stated that you needed a new actor for each request; however, the code below uses the same Actor for all queries, which, in my opinion, are a more efficient / probable use case. When creating an actor, you can always move inside handleRequest.
First, we need an actor to process the response request:
import akka.actor.Actor import akka.http.scaladsl.server.{RequestContext, RouteResult} import akka.http.scaladsl.model.HttpResponse class RequestActor extends Actor {
Now create a utility function to query the Actor:
import akka.actor.ActorRef import scala.concurrent.Future import akka.pattern.ask object RequestActor { val handleRequest : ActorRef => RequestContext => Future[RouteResult] = (actorRef) => (requestContext) => ask(actorRef,reqContext).mapTo[RouteResult] }
And all that remains to be done is to put everything together in a service:
import akka.actor.{ActorSystem, Props} import akka.stream.ActorMaterializer import akka.http.scaladsl.Http import akka.http.scaladsl.server.Directives.{get,path} import akka.util.Timeout object RouteActorTest extends App { implicit val as = ActorSystem("RouteActorTest") implicit val timeout = new Timeout(1000) val sendRequestToActor : RequestContext => Future[RouteResult] = RequestActor handleRequest (as actorOf Props[RequestActor]) val route = path("")(get(sendRequestToActor)) //rest of application... }//end object RouteActorTest
Ramon J Romero y Vigil
source share