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