阿卡HTTP +演员+圆滑的PostgreSQL
问题描述:
我重新学习Scala,我希望做一个系统的流程如下阿卡HTTP +演员+圆滑的PostgreSQL
路线(阿卡-HTTP),它要求一个演员模型(阿卡),然后询问数据库通过一个光滑的模型。
喜欢的东西
路线
path("rooms"){
get {
val rooms = (actorRoom ? GetRooms).mapTo[Seq[Room]] //bad code
complete(rooms) //bad code
}
}
ActorRoom
def receive = {
case GetRooms => sender() ! ModelRoom.getRooms()
油滑型号
val rooms = TableQuery[RoomTable]
def getRooms(): Future[Seq[Room]] = rooms.result
我的问题是,我不知道什么时候解决这个房间。
我应该在演员内部做到吗? (路线完成似乎没有等待)
我应该在路线内吗? (我应该怎么做?)
这种方法是正确的,还是演员太多?
答
当数据库调用本身是异步时,在流中添加一个Actor可能很危险,因为它可能导致不可预知的结果。
但是如果你忽略所有的不可预见性,还是要做到这一点,你可以把它像这样工作,
路线,
import akka.pattern.ask
import akka.actor.Status
import scala.util.{Success, Failure}
path("rooms"){
get {
val dbCallThroughActor = (actorRoom ? GetRooms).map({
case Status.Success(seq) => seq
case Status.Failure(ex) => throw ex
})
onComplete(dbCallThroughActor.mapTo[Seq[Room]]) {
case Success(seq) => complete(seq)
// or your can reject with your rejection handler
case Failure(ex) => complete(ex)
}
}
}
你的演员,
import context.dispatcher
def receive = {
case GetRooms =>
ModelRoom.getRooms().pipeTo(sender())
}
你的光滑模型,
val rooms = TableQuery[RoomTable]
def getRooms()(implicit ec: ExecutionContext): Future[Seq[Room]] = database.run(rooms.result)
对不起。我收到此错误:[错误] [02/24/2017 15:21:05.210] [myapp-akka.actor.default-dispatcher-3] [akka.actor.ActorSystemImpl(myapp)]处理请求期间出错:'Vector(Room(Some(1),desigual,123.4,564.4,false,None))(class scala.collection.immutable.Vector)''。完成500个内部服务器错误响应。 dbCallThroughActor不解析,并引发onComplete失败。 – Ruben
记录错误的堆栈跟踪。提供代码和堆栈跟踪。 –