2015-10-20 70 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

相关问题