2015-10-20 69 views
2

我試圖複製Integrating with Akka, Play 2.4 for Scala doc中提出的基本示例。但是我對將最終拼湊困難......在Play Framework 2.4中爲Scala實現Akka

我已經定義了演員(見第Writing actors)在app/actors/HelloActor.scala用下面的代碼:

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

然後(見Creating and using actors)我想我應該創建於app/controllers/Hello.scala控制器的東西,如:

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

    ... 

} 

的問題:在哪裏和我如何利用代碼下段Asking things of actors有一個有效的解決方案?我試圖將它添加到上面的Hello.scala控制器,但沒有成功。

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

這應該按預期工作,你有什麼錯誤? –

+0

with'implicit val timeout = 5.seconds'我試圖得到以下錯誤:value seconds不是int的成員注意:隱式值超時在這裏是不適用的,因爲它在應用程序點之後,並且它沒有顯式的結果類型'加上我並不是100%確定如何將所有東西放在控制器中 – user2364174

回答

0

找到了解決辦法,我遇到了一些問題,定義隱含超時,這是工作的控制器:

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

加我加在app/conf/routes以下路線:

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

可能如果你寫了類似'implicit val timeout:Timeout = 5.seconds'(注意我已經明確添加了類型)將會工作,這是因爲顯式類型將發生隱式轉換。 –

+0

@EndeNeu是的,謝謝,它的工作原理,我正在編輯我的答案,以反映這一點 – user2364174

相關問題