Question

I'm learning Spray and Akka. And I'm learning it through TypeSafe's templates, and this one is very complex at least:

http://typesafe.com/activator/template/akka-spray-websocket

I now understand the werid structure this template has is to separate routing logic and business logic and it's amazingly done. However, although I know the purpose of this structure, I don't know what's the functionality of this small piece and why is it necessary:

They have a class called MainActors.scala:

trait MainActors {
  this: AbstractSystem =>

  lazy val find = system.actorOf(Props[FindActor], "find")
  lazy val hide = system.actorOf(Props[HideActor], "hide")
}

Then the template concatenates all the routings under a class called ReactiveApi.scala:

trait AbstractSystem {
  implicit def system: ActorSystem
}

trait ReactiveApi extends RouteConcatenation with StaticRoute with AbstractSystem {
  this: MainActors =>

  val rootService = system.actorOf(Props(classOf[RootService], routes))

  lazy val routes = logRequest(showReq _) {
    new FindService(find).route ~
    new HideService(hide).route ~
    staticRoute
  }

  private def showReq(req : HttpRequest) = LogEntry(req.uri, InfoLevel)
}

Actually, my question is simple: what is the purpose of AbstractSystem trait? how is it used and why is it used?

This trait is also passed into actual actor:

class FindService(find : ActorRef)(implicit system : ActorSystem) extends Directives {
  lazy val route = ...
}

Also, if it is not entirely inconvenient, what's the functionality of logRequest() and showReq()?

For Spray: why do I have to pass an actor (ActorRef) into FindServce? I don't see any specific methods being invoked from inside.

Was it helpful?

Solution

This is a very simple example of using abstract defs in order to do the cake pattern (very simplified though). The goal is to say "hey, I need this thing", and the implementor must then provide the actor system to you – by implementing the def system. The goal is of course to make this def available to MainActors.

As for the self type reference, you can refer to ktoso/types-of-types#self-type-annotation to find out more about it.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top