2017-02-17 1 views
0

나는 스칼라을 학습 다시하고, 나는Akka의 HTTP + 배우 + 매끄러운 PostgreSQL을

경로 다음 데이터베이스를 묻는 배우 모델 (Akka를) 요청 (Akka-의 HTTP)을 다음과 같이 시스템의 흐름을하고 싶어 슬릭 모델을 통해.

뭔가 ActorRoom

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

슬릭 모델

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

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

경로

처럼 내 문제는 내가 방을 해결할 때 확실하지 않다 때문이다.

배우 내에서해야할까요? (완료 경로가 대기하지 않는 것 같습니다)

경로 내에서해야합니까? (어떻게해야합니까?)

이 접근법이 맞습니까, 아니면 배우가 너무 많습니까?

답변

1

DB 호출 자체가 비동기 인 경우 흐름에 액터를 추가하면 예측할 수없는 결과가 발생할 수 있으므로 위험 할 수 있습니다.

하지만이 모든 예측 불가능 성을 무시하고 여전히를 수행하려는 경우, 당신은이 같은 작업

경로,

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)) (클래스 scala.collection.immutable.Vector)'입니다. 500 내부 서버 오류 응답으로 완료. dbCallThroughActor가 분석되지 않고 onComplete의 실패가 발생합니다. – Ruben

+0

스택 추적 오류를 기록합니다. 코드 및 스택 추적을 제공하십시오. –