2016-08-26 11 views
2

私はakka-httpとreactivemongoで簡単なWebサービスを書く必要があります。データを保存するスカラ将来のakka-http

機能は、この

def saveRoute(route: Route):Future[WriteResult] = { 
    collection.insert(route) 
} 

この関数は、私はルートの挿入IDで結果を返すとせずにこれを行う必要があり、この

val userRoutes = { 
    logRequestResult("akka-http-microservice") { 
     path("routes") { 
     (post & entity(as[Route])) { route => 
      Database.saveRoute(route) 
     } 
     } 
    } 
    } 

のように見える呼び出すコードのようになります。待機するスレッド。

Database.saveRoute(route).onComplete{ 
      case Success(r) => complete(r.toString) 
      case Failure(e) => complete(e.getMessage) 
      } 

をしようとした場合、それが値を返さないため それは、コンパイルできません。 私は汚い方法でそれを作る方法を知っていますが、実際には適切な方法で作りたいと思っています。

この場合、何を行う必要がありますか?このことについて、どのように置き換える

+0

'Promise'を使用して' success'に値を入れることができます。 – sebszyller

答えて

3

私はこれを行うための最も効率的な方法を見つけたように思えます。これはoncomplete指令に組み込まれています

(path("routes"/"add") & post & entity(as[Route])) { 
    route => 
     onComplete(routesController.addRoute(route)) { 
     case Success(result) => complete(StatusCodes.Created, "OK") 
     case Failure(ex) => complete(new ErrorResponse(StatusCodes.InternalServerError.intValue, ErrorResponse.ERROR, ex.getMessage)) 
     } 
    } 
0

complete(Database.saveRoute(route).map(_.toString).recover(_.getMessage)) 
1

あなたが将来にわたりマッピングして、以下のような要求を完了することができますと

Database.saveRoute(route) 

。サイドノートでは

val future = Database.saveRoute(route) 
val response = future.map(_.getId).recover(_.getMessage) 
complete(response) 

、例外を処理するために、exceptionHandlerのを持っているし、あなたのルートでそれをラップすることをお勧めします。例hereがあります。

0

onSuccessを使用すると、将来の終了時に有効な応答を処理し、未来が成功しない場合にはhandleExceptionsを処理します。

val userRoutes = { 
    handleExceptions(mongoDbExceptionHandler) { 
     logRequestResult("akka-http-microservice") { 
     path("routes") { 
      (post & entity(as[Route])) { route => 
      onSuccess(Database.saveRoute(route)) { result => 
       complete(result) 
      } 
      } 
     } 
     } 
    } 
    } 

    // Something like this for whatever the exceptions you expect are 
    val mongoDbExceptionHandler = ExceptionHandler { 
    case ex: MongoDbReadException => complete(HttpResponse(InternalServerError, "No database"))) 
    } 

するonSuccess: http://doc.akka.io/docs/akka/2.4.9/scala/http/routing-dsl/directives/future-directives/onSuccess.html

handleExceptions: http://doc.akka.io/docs/akka/2.4.9/scala/http/routing-dsl/exception-handling.html