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

【问题讨论】:

它应该按预期工作,你有什么错误? with implicit 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的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework 2.4 发送邮件

Play Framework 2.4 全局对象迁移

如何使用 Jenkins 在本地自动部署 Play Framework (2.4) 应用程序?

由于构建或路由导致 Play Framework 2.4 编译错误

Play Framework 2.4 授权

如何在 play framework(scala) 2.4 中获取当前会话或请求对象?