如何在REST服务中使用喷射路径内的actor?

时间:2015-10-06 19:16:08

标签: scala rest akka spray

我正在尝试使用scala使用REST接口构建事件源服务。虽然我熟悉函数式编程(初学者级别的haskell),但我对scala有点新鲜。

所以我构建了持久的actor和视图而没有出现重大问题。我认为演员的想法非常简单。

object Main extends App {
  val system = ActorSystem("HelloSystem")
  val systemActor = system.actorOf(Props[SystemActor], name = "systemactor")
  val trajectoryView = system.actorOf(Props[TrajectoryView], name = "trajectoryView")
  var datas = List()
  val processData = ProcessData(0, List(1,2,3), Coordinates(50, 50))

  implicit val timeout = Timeout(5 seconds)
  def intialDatas(): List[ProcessData] =
    (for (i <- 1 to 3) yield ProcessData(i, List(1,2,3), Coordinates(50 + i, 50 + i)))(collection.breakOut)
  val command = RegisterProcessCommand(3, this.intialDatas())
  val id = Await.result(systemActor ? command, timeout.duration).asInstanceOf[String]
  println(id)
  systemActor ! MoveProcessCommand(4, ProcessData(4, List(3,4,5), Coordinates(54, 54)), id)

  val processes = Await.result(systemActor ? "get", timeout.duration).asInstanceOf[Set[Process]]
  println(processes)
  implicit val json4sFormats = DefaultFormats
  println(write(processes))
  println("*****************")
  systemActor ! "print"
  val getTrajectoryCommand = GetTrajectoryCommand(id)
  Thread.sleep(10000)
  trajectoryView ! "print"
//  val trajectory = Await.result(trajectoryView ? getTrajectoryCommand, timeout.duration).asInstanceOf[ListBuffer[Coordinates]]
  println("******* TRAJECTORY *********")
  trajectoryView ! "print"
//  println(trajectory)

  system.shutdown()
}

我已经能够创建一个脚本来与我创建的actor一起玩。

我已经阅读了关于喷涂路由的教程,但是我一直无法理解我应该做些什么来为我创建的演员提供REST接口。

object Boot extends App{
  implicit val system = ActorSystem("example")
  val systemActor = system.actorOf(Props[SystemActor], name = "systemactor")
  val trajectoryView = system.actorOf(Props[TrajectoryView], name = "trajectoryView")


  val service = system.actorOf(Props[ProcessesService], "processes-rest-service")

  implicit val timeout = Timeout(5 seconds)
  IO(Http) ? Http.Bind(service, interface = "localhost", port = 8080)
}

和服务

class ProcessesService(systemActor: ActorRef) extends Actor with HttpService {


  def actorRefFactory = context
  def receive = runRoute(route)

  val json4sFormats = DefaultFormats

  implicit val timeout = Timeout(5 seconds)
  val route = path("processes") {
    get {
      respondWithMediaType(`application/json`) {
        complete {
          write(Await.result(systemActor ? "get", timeout.duration).asInstanceOf[Set[Process]])
        }
      }
    }
  }
}

我想我需要以某种方式将SystemAf的actorRef传递给此ProcessesService,但我不确定如何。此外,我不确定如何返回对请求的响应。我知道我需要以某种方式通过ActorRef将“get”消息传递给SystemActor,然后将答案序列化为json,但我不知道该怎么做。

我很感激帮助!

1 个答案:

答案 0 :(得分:0)

在喷涂中,您可以使用Future完成路线。

您应该可以执行类似

的操作
complete { systemActor ? "get" }

Json序列化是一个单独的问题。

哦,你的问题很模糊。是的,您需要能够引用路线中的演员。您可以从定义它的boot导入val。它们只是Scala变量,因此您放置它们取决于您。