2017-02-17 32 views
0

Я заново учиться Scala, и я хотел бы сделать поток системы следующим образомAkka HTTP + актер + скользкий PostgreSQL

Маршруты (Акка-HTTP), который спрашивает актер Модель (Akka), который затем запрашивает базу данных через модель Slick.

Что-то вроде

Маршрут

path("rooms"){ 
    get { 
    val rooms = (actorRoom ? GetRooms).mapTo[Seq[Room]] //bad code 
    complete(rooms) //bad code 
    } 
} 

ActorRoom

def receive = { 
    case GetRooms => sender() ! ModelRoom.getRooms() 

Slick Модель

val rooms = TableQuery[RoomTable] 
def getRooms(): Future[Seq[Room]] = rooms.result 

Моя проблема заключается в том, что я не уверен, когда для решения комнаты.

Должен ли я делать это внутри актера? (завершение маршрута не похоже на ожидание)

Должен ли я сделать это в пределах маршрута? (как мне это сделать?)

Правильно ли этот подход, или актер слишком много?

ответ

1

Добавление актера в поток, когда ваш вызов БД асинхронен, может быть опасным, поскольку это может привести к непредсказуемым результатам.

Но если вы игнорируете всю непредсказуемость и все еще хотите сделать это, вы можете заставить его работать так,

маршрута,

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

Извините за задержку. Я получаю эту ошибку: [ERROR] [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)) (класса scala.collection.immutable.Vector)'. Выполняется с ответом 500 Internal Server Error. DbCallThroughActor не разрешает, и сбой на onComplete повышается. – Ruben

+0

регистрирует трассировку ошибки стека. Предоставьте код и трассировку стека. –