2017-03-16 5 views
0

akka-httpでは、抽出された動的なパラメータ(クライアントIP、要求ヘッダー、その他)に依存しない限り、ルートは1回だけ(ビルド時に)評価されます。akka-http 'Directive0'は、内部ルートを強制的に要求ごとに評価することを強制しますか?

私のカスタムディレクティブの1つは副作用(潜在的に変化するシステムファイル)に依存するので、毎回それを別々に実行したいと思います。私はそれを包むことができるextractNothingを探しています。

そんなことはありますか?

パラメータを消費する能力も機能しますが、(extract[Unit](_) & consume)です。

答えて

1

ルートはまだ

あなたはルートが一度だけ評価されていることを正しい動的です。しかし、どんなRouteのボディも本質的に動的である可能性があります。

val getTime =() => System.currentTimeMillis().toString 

この関数はRoute内に埋め込むことができます:

val route = 
    get { 
    path("currentTime") { 
     complete(getTime()) 
    } 
    } 

更新ファイルのルート

例として

、我々は現在の時刻を返す関数があるとし

routeが01であっても、各HttpRequestは異なる時刻値を返します。。

同様に、あなたはダイナミックHttpResponseを作成するために、アッカにstreaming file ioを使用することができ、あなたの変更、ファイルの内容となっているエンティティ:

val fileResponse =() => { 
    val file = Paths get "sourceFile.txt" 

    val chunkSource = FileIO fromPath file 

    val chunkEntity = 
    Chunked.fromData(ContentTypes.`text/plain(UTF-8)`, chunkSource) 


    HttpResponse(entity = chunkEntity) 
} 

val fileRoute = 
    get { 
    path("sourceFile") { 
     complete(fileResponse()) 
    } 
    } 

例を延びる内部&外ルート

一歩進んで動的ルートにすると、毎回失敗する関数を書くことができます:

val halfBaked =() => { 
    var isGood = true 

() => { 
    if(isGood) { 
     isGood = false 
     complete(fileResponse()) 
    } 
    else { 
     isGood = true 
     complete(StatusCodes.InternalServerError) 
    } 
    } 
} 

これを外側のルートで囲みます。

val innerRoute = halfBaked() 

val outerRoute = 
    get { 
    path("feelingLucky") { 
     innerRoute() 
    } 
    } 
+0

ニースの回答です。しかし、私の場合、それは再評価される必要がある指示自体です。これは、ディスクから認証クライアントIDを取得しており、それらはローテーションされている可能性があります。あなたのアプローチは残念ながらうまくいきません。 – akauppi

+0

@akauppiコメントに基づいて私の答えを更新しました。また、あなたの質問は多少デザイン上の欠陥を示唆しています。副作用と状態を最低レベル、可能な限り小さなスペースに分離する必要があります。私の例では、isGood状態はユーティリティ関数内にあります。 Routeレベルまでの副作用があるようです。 –

+0

あなたはデザインの瑕疵についてとても正しいです!あなたの答えのために、私は思考を再訪し、指示に従うのではなく、ファイル依存の動作をルートに移動することができました。非常に清潔で、私は非常に満足しています! :) – akauppi

関連する問題