私は、Spray API を呼び出すときに、Try を返すサービスを同期的に呼び出す必要があるコードベースに取り組んでいます。どのスプレーをフォーマットして、HTTP 経由で返す必要があります。
私の最初の試みは次のようになりました:
// Assume myService has a run method that returns a Try[Unit]
lazy val myService = new Service()
val routes =
path("api") {
get {
tryToComplete {
myService.run()
}
}
} ~
path("api" / LongNumber) { (num: Long) =>
get {
tryToComplete {
myService.run(num)
}
}
}
def tryToComplete(result: => Try[Unit]): routing.Route = result match {
case Failure(t) => complete(StatusCodes.BadRequest, t.getMessage)
case Success(_) => complete("success")
}
ただし、これによりmyService.run()
、アプリケーションの起動時に呼び出されました。HTTP 呼び出しが行われていないため、このメソッドが呼び出された理由はわかりません。
だから私は2つの質問があります:
- ルートの初期化の一部としてサービスが呼び出されるのはなぜですか?
- このケースを処理する最もクリーンな方法は何ですか? 同様のパターンをたどるエンドポイントが他にもいくつかあると想像してください。したがって、これを一貫して処理できる必要があります。