what framework scala playframework akka

what - java scala framework



Reproducir 2.5 con Akka: no se pudo encontrar el valor implícito para el tiempo de espera del parámetro: akka.util.Timeout (1)

Estoy intentando probar Akka con Play 2.5 y me encuentro con un error de compilación que parece que no puedo moverme.

Estoy siguiendo esta página desde los documentos de Google Play: https://playframework.com/documentation/2.5.x/ScalaAkka

Aquí está el código completo:

package controllers import javax.inject.{Inject, Singleton} import akka.actor.ActorSystem import controllers.HelloActor.SayHello import play.api.mvc._ import play.api.libs.concurrent.Execution.Implicits.defaultContext import scala.concurrent.duration._ import akka.pattern.ask @Singleton class Application @Inject()(system: ActorSystem) extends Controller { implicit val timeout = 5.seconds val helloActor = system.actorOf(HelloActor.props, "hello-actor") def sayHello(name: String) = Action.async { (helloActor ? SayHello(name)).mapTo[String].map { message => Ok(message) } } } 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 } }

Mi ruta se ve así:

GET /:name controllers.Application.sayHello(name: String)

Y, finalmente, mi build.sbt:

name := "AkkaTest" version := "1.0" lazy val `akkatest` = (project in file(".")).enablePlugins(PlayScala) scalaVersion := "2.11.7" libraryDependencies ++= Seq( jdbc , cache , ws , specs2 % Test ) unmanagedResourceDirectories in Test <+= baseDirectory ( _ /"target/web/public/test" ) resolvers += "scalaz-bintray" at "https://dl.bintray.com/scalaz/releases" routesGenerator := InjectedRoutesGenerator

Cuando intento ejecutar esto, obtengo el siguiente error de compilación:

could not find implicit value for parameter timeout: akka.util.Timeout

Intenté mover el tiempo de espera en vano. ¿Alguien tiene una idea de lo que podría causar este error de compilación?


Obtiene este error porque el patrón ask requiere un tiempo de espera implícito para preguntar (se completará en el futuro con TimeoutException si no se recibió respuesta por el momento). Entonces todo lo que necesitas es crear un valor local implícito en el método sayHello esta manera:

import akka.util.Timeout import scala.concurrent.duration.Duration // ... def sayHello(name: String) = Action.async { implicit val timeout: Timeout = Duration.Infinite (helloActor ? SayHello(name)).mapTo[String].map { message => Ok(message) } }

En lugar de especificar el tiempo de espera infinito, puede especificar uno finito con la siguiente sintaxis:

import scala.concurrent.duration._ import akka.util.Timeout implicit val duration: Timeout = 20 seconds