I started out with, quite honestly, a stupid idea. However, once I started 
it I wanted to see it through to learn from it and hopefully gain some 
insight into how you might actually write a directive. I've discovered a 
few things in the process, but have no idea why these things are the way 
they are (I'm quite new to Scala, so this may actually be more of a general 
Scala question that just happens to be relevant to Akka HTTP).

So I'd seen that some people in the past had used the "actor-per-request" 
pattern with things like Spray. In many ways this made a lot of sense to 
me, because in doing so it provides a nice entrypoint into using other 
actors in a request, as your action-handling code can actually react to 
messages appropriately. I still don't really know if that is a good idea or 
not, it's probably entirely unnecessary, but for now we can just assume I'm 
also trying to learn a little about actors.

With all of that in mind, I wanted to make a directive to reduce some of 
the boilerplate in creating an actor, and asking it a message. My first 
attempt looked something like this:

def withActor[A <: Actor: ClassTag](message: Any): Directive1[Future[Any]] = {
  provide(system.actorOf(Props[A]) ? message)
}


Now, I know that this thing is pretty much completely pointless, because it 
doesn't even take that much to just do this yourself in reality. I had 
planned to add some more to this, like moving the onComplete call into it 
or something. Again though, this is just for learning now really. 

To be honest, this approach actually does work now I've figured out this 
last detail that eluded me for so long. I actually have to use it something 
like this:

val route: Route =
  pathSingleSlash {
    get {
      withActor[RequestHandler](RequestHandler.Handle).apply { future =>
        onComplete(future) {
          case Success(result: RequestHandler.Result) => complete(result.data)
          case _ => complete(StatusCodes.InternalServerError)
        }
      }
    }
  }


So, the .apply there is necessary - and this is what is confusing me right 
now. It seems to be the type parameter being there that is causing this. It 
also happens if you try add implicit parameters in a separate argument list 
too. In the case of the implicit arguments I can at least understand why, 
because the block following the function call would be treated as the bit 
inside the curly braces, so calling apply makes it a bit more explicit. In 
this case though, I don't know why I have to call apply. Can anybody 
explain?

-- 
>>>>>>>>>>      Read the docs: http://akka.io/docs/
>>>>>>>>>>      Check the FAQ: 
>>>>>>>>>> http://doc.akka.io/docs/akka/current/additional/faq.html
>>>>>>>>>>      Search the archives: https://groups.google.com/group/akka-user
--- 
You received this message because you are subscribed to the Google Groups "Akka 
User List" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/akka-user.
For more options, visit https://groups.google.com/d/optout.

Reply via email to