2016-03-29 13 views
7

Załóżmy, że skonfigurowałem dowolnie złożony kod Flow[HttpRequest, HttpResponse, Unit].akka-http: pełne żądanie z przepływem

mogę już używać wspomnianego przepływu do obsługi żądań przychodzących z

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

Teraz chciałbym dodać rejestrowanie, wykorzystując pewną istniejącą dyrektywę, jak logRequestResult("my-service"){...} Czy istnieje sposób, aby połączyć tę dyrektywę z moim strumieniu? Przypuszczam, że szukam innej dyrektywy, coś podobnego do tego, co można zrobić pod tym numerem:

def completeWithFlow(flow: Flow): Route 

Czy to w ogóle możliwe?

N.B .: logRequestResult to przykład, moje pytanie dotyczy każdej dyrektywy, która może się okazać przydatna.

+0

Dlaczego rejestracja musi być zapewniona przez dyrektywę? Dlaczego nie możesz po prostu użyć Flow.log? –

+0

Tak, mógłbym użyć Flow.log dla tego konkretnego przykładu. moje pytanie było nieco bardziej ogólne, ponieważ: jeśli mam gotową dyrektywę, którą chciałbym wykorzystać, jak mogę ją wykorzystać w moim kontekście? Powiedzmy, że chcesz obsłużyć .favicon żądania wykorzystując dyrektyw poniżej ścieżki ("favicon.ico") { getFromResource ("favicon.ico", 'image/x-icon') } chciałbym być możliwość korzystania z tej dyrektywy w połączeniu z moim przepływem, np użyj mojego przepływu, aby wyświetlić określoną ścieżkę, i użyj powyższej dyrektywy, aby wyświetlić/favicon. –

Odpowiedz

4

Okazuje się, że jeden (i być może jedyną) sposobem jest drut i ujawnić nowy przepływ, i paszy ekstrahuje żądanie do niego. Przykład poniżej:

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

Szukasz route2HandlerFlow lub Route.handlerFlow?

Wierzę, że Route.handlerFlow będzie działać w oparciu o implicit s.

przykład/

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

Dziękuję, w rzeczywistości szukam czegoś przeciwnego. –

+1

:) Zawsze cieszę się z pomocy ... komuś ... może –