为Scala实现Akka in-Play框架2.4
我试图复制本文中提出的基本示例。但是我很难把最后的部分放在一起 我在为Scala实现Akka in-Play框架2.4,scala,akka,playframework-2.4,Scala,Akka,Playframework 2.4,我试图复制本文中提出的基本示例。但是我很难把最后的部分放在一起 我在app/actors/HelloActor.scala中定义了参与者(见段落),代码如下: package actors import akka.actor._ object HelloActor { def props = Props[HelloActor] case class SayHello(name: String) } class HelloActor extends Actor {
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
}
}
然后(请参阅),我想我应该在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")
...
}
问题:我在何处以及如何利用下一段中的代码来获得有效的解决方案?我尝试将其添加到上面的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)
}
}
找到解决方案后,我在定义隐式超时时遇到了一些问题,这是正在工作的控制器:
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)
它应该像预期的那样工作,您有哪些错误?使用
implicit val timeout=5.seconds
I wag获取以下错误value seconds不是Int的成员注意:这里不适用implicit value timeout,因为它位于应用点之后,并且缺少显式的结果类型
而且我对如何放置所有内容没有100%的把握在控制器中,如果您编写类似于隐式val timeout:timeout=5的内容,则可能会起作用。请注意,我已显式添加了类型),这是因为显式类型将发生隐式转换。@EndeNeu是的,谢谢,它起作用了,我正在编辑我的答案以反映这一点