我正在尝试使用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,但我不知道该怎么做。
我很感激帮助!
答案 0 :(得分:0)
在喷涂中,您可以使用Future
完成路线。
您应该可以执行类似
的操作complete { systemActor ? "get" }
Json序列化是一个单独的问题。
哦,你的问题很模糊。是的,您需要能够引用路线中的演员。您可以从定义它的boot
导入val。它们只是Scala变量,因此您放置它们取决于您。