2016-03-29 9 views
7

Angenommen, ich habe eine beliebig komplexe Flow[HttpRequest, HttpResponse, Unit] eingerichtet.akka-http: komplette Anfrage mit Ablauf

Ich kann schon gesagt verwenden Fluss eingehende Anfragen bearbeiten mit

Http().bindAndHandle(flow, "0.0.0.0", 8080) 

Nun möchte Ich mag die Protokollierung hinzufügen, einige bestehende Richtlinie nutzen, wie logRequestResult("my-service"){...} Gibt es eine Möglichkeit, diese Richtlinie mit meinem Fluss zu kombinieren? Ich denke, ich suche eine andere Richtlinie, etwas in Richtung der

def completeWithFlow(flow: Flow): Route 

Ist das überhaupt möglich?

N.B .: logRequestResult ist ein Beispiel, meine Frage gilt für jede Richtlinie, die nützlich sein könnte.

+0

Warum muss der Holzeinschlag von einer Richtlinie bereitgestellt werden? Warum kannst du Flow.log nicht einfach verwenden? –

+0

Ja, ich könnte Flow.log für dieses spezielle Beispiel verwenden. meine Frage war ein wenig generischer, als in: Wenn ich eine gebrauchsfertige Direktive habe, möchte ich sie nutzen, wie kann ich sie in meinem Kontext wiederverwenden? Sagen wir, ich .favicon Anfragen nutzt die Richtlinien unten Pfad ("favicon.ico") { getFromResource ("favicon.ico", 'image/x-icon') } behandeln möchten Ich möchte sein in der Lage, diese Richtlinie in Kombination mit meinem Fluss zu verwenden, z Verwenden Sie meinen Flow, um einen bestimmten Pfad zu bedienen, und verwenden Sie die obige Anweisung, um/favicon zu bedienen. –

Antwort

4

dreht ein (und vielleicht einzige) Weg ist, um Draht und einem neuen Fluss zu materialisieren, und führen die extrahierte Anforderung zu. Beispiel unten

val myFlow: Flow[HttpRequest, HttpResponse, NotUsed] = ??? 

    val route = 
    get { 
     logRequestResult("my-service") { 
     extract(_.request) { req ⇒ 
      val futureResponse = Source.single(req).via(myFlow).runWith(Sink.head) 
      complete(futureResponse) 
     } 
     } 
    } 

    Http().bindAndHandle(route, "127.0.0.1", 9000) 
0

http://doc.akka.io/docs/akka/2.4.2/scala/http/routing-dsl/overview.html

Suchen Sie route2HandlerFlow oder Route.handlerFlow?

Ich glaube, Route.handlerFlow funktioniert basierend auf implicit s.

eg/

val serverBinding = Http().bindAndHandle(interface = "0.0.0.0", port = 8080, 
handler = route2HandlerFlow(mainFlow())) 
+0

Danke, ich suche tatsächlich das Gegenteil. –

+1

:) Immer froh zu helfen ... zu jemandem ... vielleicht –