2016-03-07 17 views
3

我試圖用Play 2.5來測試Akka,而且我遇到了編譯錯誤,我似乎無法繞過。與Akka一起玩2.5 - 找不到參數超時的隱含值:akka.util.Timeout

我從玩文檔下面這個頁面: https://playframework.com/documentation/2.5.x/ScalaAkka

下面是完整的代碼:

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 
    } 
} 

我的路線是這樣的:

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

最後, my 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 

當我嘗試運行它,我得到以下編譯錯誤:

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

我已經試過周圍的超時移動無濟於事。有沒有人有一個想法可能會導致此編譯錯誤?

回答

11

由於詢問需要隱式超時詢問(如果此時未收到答案,它將以TimeoutException完成未來),您會收到此錯誤。因此,所有你需要的是這樣的sayHello方法來創建一個隱含的局部值:

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) 
    } 
    } 

除了指定無限超時的你,可以指定與下面的語法有限之一:

import scala.concurrent.duration._ 
import akka.util.Timeout 

implicit val duration: Timeout = 20 seconds 
+0

哇,謝謝!我不能相信我錯過了 - 現在完美的作品。 – Nick

+0

對於記錄,2.5 docs具有如下行'implicit val timeout = 5.seconds',它無法工作(具有相同的上述錯誤),直到您明確添加TYPE如下:'implicit val timeout:Timeout = 5。 seconds' – Techmag

相關問題