简体   繁体   中英

Implementing Akka in Play Framework 2.4 for Scala

I am trying to replicate the basic example proposed in the Integrating with Akka, Play 2.4 for Scala doc . But I have difficulties in placing the final pieces together...

I have defined the actor (see paragraph Writing actors ) at app/actors/HelloActor.scala with the following code:

package actors

import akka.actor._

object HelloActor {
    def props = Props[HelloActor]

    case class SayHello(name: String)
}

class HelloActor extends Actor {
    import HelloActor._

    def receive = {
        case SayHello(name: String) =>
            sender() ! "Hello, " + name
    }
}

Then (see Creating and using actors ) I suppose I should create a controller at app/controllers/Hello.scala with something like:

package controllers

import play.api.mvc._
import akka.actor._
import javax.inject._

import actors.HelloActor

@Singleton
class Hello @Inject() (system: ActorSystem) extends Controller {

    val helloActor = system.actorOf(HelloActor.props, "hello-actor")

    ...

}

The question: where and how I utilize the code in the following paragraph Asking things of actors to have a working solution? I have tried to add it to the above Hello.scala controller but without success.

import play.api.libs.concurrent.Execution.Implicits.defaultContext
import scala.concurrent.duration._
import akka.pattern.ask
implicit val timeout = 5.seconds

def sayHello(name: String) = Action.async {
    (helloActor ? SayHello(name)).mapTo[String].map { message =>
        Ok(message)
    }
}

Found the solution, I had some problems with defining the implicit timeout, this is the working controller:

package controllers

import play.api.mvc._
import akka.actor._
import javax.inject._

import actors.HelloActor
import actors.HelloActor.SayHello

import play.api.libs.concurrent.Execution.Implicits.defaultContext
import scala.concurrent.duration._
import akka.pattern.ask
import akka.util.Timeout

@Singleton
class Hello @Inject() (system: ActorSystem) extends Controller {

  val helloActor = system.actorOf(HelloActor.props, "hello-actor")

  implicit val timeout: Timeout = 5.seconds

  def sayHello(name: String) = Action.async { 

    (helloActor ? SayHello(name)).mapTo[String].map { message ⇒
      Ok(message)
    }
  }
}

Plus I added the following route in app/conf/routes :

# Actor test
GET     /hello/:name                controllers.Hello.sayHello(name)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM