阿卡HTTP +演员+圆滑的PostgreSQL

阿卡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) 
+0

对不起。我收到此错误:[错误] [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

+0

记录错误的堆栈跟踪。提供代码和堆栈跟踪。 –