【问题标题】:Implementing Akka in Play Framework 2.4 for Scala在 Play Framework 2.4 中为 Scala 实现 Akka
【发布时间】: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% 确定如何将所有东西放在控制器中

标签: scala akka playframework-2.4


【解决方案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 是的,谢谢,它有效,我正在编辑我的答案以反映这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 2016-08-05
  • 1970-01-01
相关资源
最近更新 更多