在 Play Framework 2.4 中为 Scala 实现 Akka
Posted
技术标签:
【中文标题】在 Play Framework 2.4 中为 Scala 实现 Akka【英文标题】:Implementing Akka in Play Framework 2.4 for Scala 【发布时间】:2015-10-20 10:06:13 【问题描述】:我正在尝试复制Integrating with Akka, Play 2.4 for Scala doc 中提出的基本示例。但是我很难将最后的部分放在一起......
我已经使用以下代码在app/actors/HelloActor.scala
定义了演员(参见Writing actors 段):
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)
【问题讨论】:
它应该按预期工作,你有什么错误? withimplicit val timeout = 5.seconds
我摇摇晃晃地收到以下错误 value seconds is not a member of Int Note: implicit value timeout is not applicable here because it comes after the application point and it lacks an explicit result type
加上我不是 100% 确定如何将所有东西放在控制器中
【参考方案1】:
找到了解决方案,我在定义隐式超时时遇到了一些问题,这是工作控制器:
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: Timeout = 5.seconds
的东西(注意我已经明确添加了类型)可能会起作用,这是因为显式类型会发生隐式转换。
@EndeNeu 是的,谢谢,它有效,我正在编辑我的答案以反映这一点以上是关于在 Play Framework 2.4 中为 Scala 实现 Akka的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Jenkins 在本地自动部署 Play Framework (2.4) 应用程序?